2010-01-07 17 views

Répondre

2

Pas une réponse directe, par comme une alternative à getObjectsById, il semble que vous pouvez utiliser un JDOQL query to load multiple entities by key:

public List getById(List keys) { 
    Query q = pm.newQuery(
     "select from " + Book.class.getName() + " where :keys.contains(key)"); 
    return (List) q.execute(keys); 
} 

Apparemment, cette requête est optimisé pour utiliser une API en vrac à faible niveau efficace.

L'ordre des clés est cependant perdu, vous devrez donc trier à nouveau le résultat en Java.

+0

Je ne suis pas en mesure de le faire fonctionner: Problème avec la requête : méthode non prise en charge lors de l'analyse d'expression. InvokeExpression {[ParameterExpression {touches}] contient (VariableExpression {touche})} –

3

Utilisez PersistenceManager.newObjectIdInstance(), en tant que telle

List<Object> ids = new ArrayList<Object>(); 
for (Key key : keys) { 
    ids.add(pm.newObjectIdInstance(Foo.class, key)); 
} 

return (List<Foo>) pm.getObjectsById(ids); 

Je ne suis pas sûr mais combien coûte l'appel à newObjectIdInstance est (il ne devrait pas être de ce que je peux voir).

+0

C'est très cher! – Sam

+0

@Sam, quelle alternative comparez-vous? Est-ce plus cher que la solution de Thilo? Comment évaluez-vous le coût de cet appel? – Price

0

La réponse ci-dessus est presque correcte.

Il semble y avoir une erreur dans la syntaxe expliquée par Google sur leur site Web de développeurs.

Expliqué par google:

// Donnez-moi tous les employés lastName égal à Smith ou Jones query = pm.newQuery (Employee.class, ": p.contains (nom)") ; query.execute (Arrays.asList ("Smith", "Jones"));

Assurément, il devrait être:

// Donnez-moi tous les employés lastName égal à Smith ou Jones query = pm.newQuery (Employee.class, « p.contains (lastName) "); query.execute (Arrays.asList ("Smith", "Jones"));

+0

Le document est correct. Le ": p" est votre liste, et vous recherchez des objets dont "lastName" est contenu dans votre liste, donc .contains (). – opowell