Java App Engine-Datenspeicher: Wie Felder Objekt geerbten Klassen abzufragen?
-
12-09-2019 - |
Frage
App Engine 1.2.2. Ich definiere eine Klasse Produkt wie folgt:
@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 definiere eine abgeleitete Klasse Buch wie folgt:
@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 machen etwa so:
PersistenceManager pm = PMF.get () getPersistenceManager (). pm.makePersistent (neues Buch ( "George Orwell", "1984"));
Ich kann für dieses neue Objekt abfragen, um eine Abfrage wie mit:
Abfrage query = pm.newQuery ( "wählen Sie aus" + Book.class.getName () + "wo Autor == param"); query.declareParameters ( "String param"); Listenergebnisse = (List) query.execute ( "George Orwell");
Das gibt das Objekt, weil ich ein Feld ‚Autor‘ auf Buch definiert bin abfragt.
Allerdings funktioniert das nicht:
Abfrage query = pm.newQuery ( "wählen Sie aus" + Book.class.getName () + "wo Titel == param"); query.declareParameters ( "String param"); Listenergebnisse = (List) query.execute ( "1984");
Es gibt eine Ausnahme aus, die dort heißt es ist kein Feld ‚Titel‘, auch durch diese auf der abgeleiteten Klasse Produkt 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 nicht in den Datenspeicher-Abfragen zur Verfügung stehen.
Ist dies in der Tat möglich, mit einer Variation der Syntax oder mit Anmerkungen?
Lösung
aus: http://code.google.com/appengine /docs/java/datastore/usingjdo.html
Nicht unterstützte Funktionen von JDO
Die folgenden Merkmale der JDO-Schnittstelle werden nicht von der App Engine-Implementierung unterstützt:
Unowned Beziehungen. Sie können nicht im Besitz befindlichen Beziehungen mit expliziten Schlüsselwerte umzusetzen. JDO Syntax für unowned Beziehungen kann in einer zukünftigen Version unterstützt werden. Owned many-to-many-Beziehungen.
"Join" Abfragen. Sie können ein Feld eines Kindes Einheit in einem Filter verwenden, wenn eine Abfrage auf der übergeordneten Art durchführen. Beachten Sie, dass Sie die Eltern Beziehungsfeld direkt in Abfrage mit einem Schlüssel testen können.
JDOQL Gruppierung und andere Aggregatabfragen.
polymorphe Abfragen. Sie können keine Abfrage einer Klasse erhalten Instanzen einer Unterklasse durchführen. Jede Klasse wird durch eine separate Einheit Art im Datenspeicher dargestellt.
IdentityType.DATASTORE für die @PersistenceCapable Anmerkung. Nur IdentityType.APPLICATION unterstützt wird.
Es gibt derzeit einen Fehler verhindert persistente Felder auf Super verhindert auf den Datenspeicher gespeichert werden. Dies wird in einer zukünftigen Version behoben werden.
Andere Tipps
Diese Abfrage unter Verwendung von Datanucleus mit einer der anderen Datenspeichern wir (z RDBMS, XML, Excel, usw.) unterstützen, sollte in der Tat Felder in Oberklassen ermöglichen; die Abfrage gültig ist JDOQL. Wenn sie in GAE nicht funktionieren / J dann melden Sie das Problem in der Google-issue tracker, obwohl es dort sicherlich ein Thema, über die Vererbung ist bereits http://code.google.com/p/datanucleus-appengine/issues/ Liste