2009-11-02 3 views

Répondre

0

Si vous utilisez le magasin de données de bas niveau, c'est facile, car "ancêtre" est un concept de banque de données et non un concept JDO/JPA AFAIK.

here est un lien vers la javadoc montrant le constructeur de requête qui prend un ancêtre clé

1

Essayez cette approche:

// PersistenceManager pm = ...; 
Transaction tx = pm.currentTransaction(); 
User user = userService.currentUser(); 
List<Account> accounts = new ArrayList<Account>(); 

try { 
    tx.begin(); 

    Query query = pm.newQuery("select from Customer " + 
           "where user == userParam " + 
           "parameters User userParam"); 
    List<Customer> customers = (List<Customer>) 
    query.execute(user); 

    query = pm.newQuery("select from Account " + 
         "where parent-pk == keyParam " + 
         "parameters Key keyParam"); 
    for (Customer customer : customers) { 
     accounts.addAll((List<Account>) 
     query.execute(customer.key)); 
    } 

} finally { 
    if (tx.isActive()) { 
     tx.rollback(); 
    } 
} 

Plus d'informations sont disponibles ici: http://code.google.com/appengine/docs/java/datastore/transactions.html#Uses_For_Transactions

+0

Vous n'avez pas effectué la transaction nulle part. – Price

2

je me débattais avec celui-ci pendant un certain temps, mais ce qui suit va fonctionner! La réponse courte est que JDO utilisé avec App Engine peut certainement prendre en charge les requêtes Ancestor, donc vous n'avez pas besoin de recourir à l'API de bas niveau propre à App Engine, surtout si vous voulez rester avec JDO dans votre application.

Étape 1:

Dans la classe des enfants assurez-vous d'avoir la variable d'instance suivante. Le nom réel de la variable n'a pas d'importance. Ce qui est important, c'est l'annotation.

@Persistent 
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true") 
private String mParentEncKey; 

Étape 2:

Lors de l'interrogation de l'objet enfant (s) par la clé parent, vous voulez puis filtrer sur le parentKey via le nom de la variable d'instance vous avez créé ... dans ce cas Cet exemple est pour si vous souhaitez interroger un ensemble d'objets enfants qui ont une propriété, étant donné que vous connaissez la clé parent et cette propriété.

public static List<ChildObject> queryYourChildObjects(String parentKey, String someProperty) { 

     PersistenceManager pm = PMF.get().getPersistenceManager(); 
     Query q = pm.newQuery(ChildObject.class); 
     q.setFilter("mParentEncKey == parentKeyParam && property == propertyParam"); 
     q.declareParameters("String parentKeyParam, String propertyParam"); 
     List<ChildObject> results = (List<ChildObject>) q.execute(parentKey, someProperty); 
     return results; 
    } 

C'est tout! J'espère que ça aide.

+0

Vous pouvez également utiliser Objectify, comme dans cette réponse: http://stackoverflow.com/a/11365390/305689 – wescpy

Questions connexes