Domanda

AppEngine 1.2.2. Mi definisco una classe di prodotto in questo modo:

@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;
}

definisco una classe derivata libro in questo modo:

@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;
}

Ho poi fare un nuovo oggetto in questo modo:

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

posso interrogare per questo nuovo oggetto utilizzando una query del tipo:

query di query = pm.newQuery ( "selezionare da" + Book.class.getName () + "dove autore == param");  query.declareParameters ( "String param");  risultati list = (List) query.execute ( "George Orwell");

Questo restituisce l'oggetto, perché io sono l'interrogazione di un campo 'autore' definito sul Libro.

Tuttavia questo non funziona:

query di query = pm.newQuery ( "selezionare da" + Book.class.getName () + "in cui il titolo == param");  query.declareParameters ( "String param");  risultati list = (List) query.execute ( "1984");

Si genera un'eccezione in cui si afferma non c'è campo 'title', anche attraverso questo è definito sulla classe prodotto derivato.

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

E 'come se i campi di classi ereditate non sono disponibili nelle query datastore.

E 'questo infatti possibile con una variazione sulla sintassi, o con le annotazioni?

È stato utile?

Soluzione

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

Caratteristiche non supportate di JDO

Le seguenti caratteristiche dell'interfaccia JDO non sono supportati dall'implementazione App Engine:

relazioni senza un proprietario. È possibile implementare i rapporti senza proprietario utilizzando i valori chiave espliciti. la sintassi di JDO per i rapporti senza proprietario può essere supportato in una versione futura. Di proprietà molti-a-molti.

"Partecipa" query. Non è possibile utilizzare un campo di un'entità figlio in un filtro quando si esegue una query del tipo genitore. Si noti che è possibile testare campo di relazione con i genitori direttamente nella query utilizzando una chiave.

raggruppamento JDOQL e altre query di aggregazione.

query polimorfico. Non è possibile eseguire una query di una classe per ottenere le istanze di una sottoclasse. Ogni classe è rappresentato da una sorta un'entità separata nell'archivio dati.

IdentityType.DATASTORE per l'annotazione @PersistenceCapable. È supportata solo IdentityType.APPLICATION.

Non c'è attualmente un bug prevenire prevenire campi persistenti sulla superclassi vengano salvati al datastore. Questo problema verrà risolto in una versione futura.

Altri suggerimenti

Quello di query, utilizzando DataNucleus con uno qualsiasi degli altri archivi di dati che sosteniamo (es RDBMS, XML, Excel, ecc), dovrebbe effettivamente consentire campi in superclassi; la query è valida JDOQL. Se essi non funzionano in GAE / J quindi segnalare il problema in issue tracker di Google, anche se v'è certamente un problema là circa eredità già http://code.google.com/p/datanucleus-appengine/issues/ lista

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top