Question

AppEngine 1.2.2. Je définis un produit de classe comme ceci:

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

Je définis un livre de classe dérivée comme ceci:

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

Je fais alors un nouvel objet comme ceci:

PersistenceManager h = PMF.get () getPersistenceManager ().  pm.makePersistent (nouveau livre ( "George Orwell", "1984"));

Je peux interroger pour ce nouvel objet à l'aide d'une requête comme:

query = pm.newQuery ( "Sélectionner" + Book.class.getName () + "où l'auteur == PARAM");  query.declareParameters ( "String param");  Liste des résultats = (Liste) query.execute ( "George Orwell");

renvoie l'objet, parce que je suis un champ Interrogation « auteur » défini dans le Livre.

Toutefois, cela ne fonctionne pas:

query = pm.newQuery ( "Sélectionner" + Book.class.getName () + "où le titre == PARAM");  query.declareParameters ( "String param");  Liste des résultats = (Liste) query.execute ( "1984");

Il jette une exception qui indique il n'y a pas de champ « titre », même à travers elle est définie sur le produit de la classe dérivée.

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

Il semble que si les champs de classes héritées ne sont pas disponibles dans les requêtes de magasin de données.

Est-ce en effet possible avec une variation sur la syntaxe, ou avec des annotations?

Était-ce utile?

La solution

à partir de: http://code.google.com/appengine /docs/java/datastore/usingjdo.html

Caractéristiques de JDO non pris en charge

Les caractéristiques suivantes de l'interface JDO ne sont pas pris en charge par la mise en œuvre App Engine:

relations sans propriétaire. Vous pouvez mettre en œuvre des relations explicites unowned à l'aide des valeurs clés. La syntaxe de JDO pour les relations unowned peut être pris en charge dans une version future. Appartenant à plusieurs à plusieurs.

requêtes "Join". Vous ne pouvez pas utiliser un champ d'une entité enfant dans un filtre lorsque vous effectuez une requête sur le genre de parent. Notez que vous pouvez tester le champ de la relation du parent directement dans la requête à l'aide d'une clé.

groupement JDOQL et d'autres requêtes d'agrégation.

requêtes polymorphes. Vous ne pouvez pas effectuer une requête d'une classe pour obtenir des instances d'une sous-classe. Chaque classe est représentée par une sorte d'entité distincte dans le datastore.

IdentityType.DATASTORE pour l'annotation @PersistenceCapable. Seul IdentityType.APPLICATION est pris en charge.

Il y a actuellement un bug qui empêchait la prévention de champs persistants sur superclasses d'être enregistrées dans le magasin de données. Cela sera corrigé dans une future version.

Autres conseils

Cette requête, en utilisant DataNucleus avec l'une des autres magasins de données que nous soutenons (SGBDR, XML par exemple, Excel, etc.), devrait en effet permettre à des champs dans superclasse; la requête est valide JDOQL. Si elles ne fonctionnent pas dans GAE / J puis signaler le problème dans le suivi des problèmes de Google, mais il y a certainement un problème là-bas sur l'héritage déjà http://code.google.com/p/datanucleus-appengine/issues/ liste

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top