2009-08-11 10 views
1

AppEngine 1.2.2. Ich definiere eine Klasse Produkt wie folgt:Java App Engine-Datenspeicher: Wie können Felder von geerbten Objektklassen abgefragt werden?

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products") 
public class Product { 

public Product(String title) { 
    super(); 
    this.title = title; 
} 

public String getTitle() { 
    return title; 
} 

@Persistent 
String title; 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key id; 
} 

ich eine abgeleitete Klasse Buch wie so definieren:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products") 
public class Book extends Product { 

public Book(String author, String title) { 
    super(title); 
    this.author = author; 
} 

public String getAuthor() { 
    return author; 
} 

@Persistent 
String author; 
} 

ich dann ein neues Objekt wie so machen:

PersistenceManager pm = PMF.get() .getPersistenceManager(); pm.makePersistent (neues Buch ("George Orwell", "1984"));

ich für dieses neue Objekt abfragen kann eine Abfrage wie mit:

Abfrage query = pm.newQuery ("wählen Sie aus" + Book.class.getName() + "wo Autor == param"); query.declareParameters ("String param"); Listenergebnisse = (Liste) query.execute ("George Orwell");

Das gibt das Objekt zurück, weil ich ein Feld 'Autor' abfrage, das auf Book definiert ist.

Allerdings funktioniert das nicht:

Abfrage query = pm.newQuery ("wählen Sie aus" + Book.class.getName() + "wo Titel == param"); query.declareParameters ("String param"); Listenergebnisse = (Liste) query.execute ("1984");

Es löst eine Ausnahme aus, die besagt, dass es kein Feld 'title' gibt, selbst wenn dies für die abgeleitete Klasse Product definiert ist.

javax.jdo.JDOUserException: Field "title" does not exist in com.example.Book or is not persistent 
NestedThrowables: 
org.datanucleus.store.exceptions.NoSuchPersistentFieldException: Field "title" does not exist in com.example.Book or is not persistent 

Es scheint, als ob Felder aus geerbten Klassen in den Datenspeicherabfragen nicht verfügbar sind.

Ist dies tatsächlich mit einer Variation der Syntax oder mit Anmerkungen möglich?

Antwort

3

aus: http://code.google.com/appengine/docs/java/datastore/usingjdo.html

Nicht unterstützte Funktionen von JDO

Die folgenden Funktionen der JDO-Schnittstelle werden von der App Engine-Implementierung nicht unterstützt:

Nicht zugeordnete Beziehungen. Sie können nicht zugeordnete Beziehungen mithilfe expliziter Schlüsselwerte implementieren. Die JDO-Syntax für nicht zugeordnete Beziehungen wird möglicherweise in einer zukünftigen Version unterstützt. Viele-zu-viele-Beziehungen.

"Join" Abfragen. Sie können ein Feld einer untergeordneten Entität in einem Filter nicht verwenden, wenn Sie eine Abfrage für die übergeordnete Art durchführen. Beachten Sie, dass Sie das Beziehungsfeld des übergeordneten Elements direkt in der Abfrage mithilfe eines Schlüssels testen können.

JDOQL-Gruppierung und andere Aggregatabfragen.

Polymorphe Abfragen.Sie können keine Abfrage einer Klasse ausführen, um Instanzen einer Unterklasse abzurufen. Jede Klasse wird im Datenspeicher durch eine separate Entitätsart dargestellt.

IdentityType.DATASTORE für die Annotation @PersistenceCapable. Nur IdentityType.APPLICATION wird unterstützt.

Derzeit gibt es einen Fehler, der verhindert, dass persistente Felder in Superklassen im Datenspeicher gespeichert werden. Dies wird in einer zukünftigen Version behoben werden.

1

Diese Abfrage, die DataNucleus mit einem anderen von uns unterstützten Datenspeicher verwendet (z. B. RDBMS, XML, Excel usw.), sollte tatsächlich Felder in Superklassen zulassen. Die Abfrage ist gültig JDOQL. Wenn sie in GAE nicht funktionieren/J dann melden Sie das Problem in den Google-issue tracker, obwohl es dort sicherlich ein Thema, über die Vererbung ist bereits http://code.google.com/p/datanucleus-appengine/issues/list