2010-01-07 25 views

Antwort

2

keine direkte Antwort, indem sie als Alternative zu getObjectsById, so scheint es, dass Sie ein JDOQL query to load multiple entities by key verwenden:

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

Offenbar diese Abfrage optimiert wird, um eine effiziente Low-Level-Bulk-API zu verwenden.

Die Reihenfolge der Schlüssel geht jedoch verloren, so dass Sie das Ergebnis in Java Land neu sortieren müssen.

+0

ich nicht in der Lage bin, damit es funktioniert: mit Abfrage Problem : Nicht unterstützte Methode während Ausdrucksanalyse. InvokeExpression {[{Parameterexpression Tasten}] enthält (VariableExpression {key})} –

3

Verwendung PersistenceManager.newObjectIdInstance(), als solche

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

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

bin ich aber nicht sicher, wie teuer der Anruf an newObjectIdInstance ist (es ist nicht aus sein sollte, was ich sehen kann).

+0

Es ist sehr teuer! – Sam

+0

@Sam, mit welcher Alternative vergleichen Sie? Ist es teurer als Thilos Lösung? Wie bewerten Sie, wie teuer dieser Anruf ist? – Price

0

Die Antwort über mir ist fast richtig.

Es scheint einen Fehler in der Syntax zu geben, die Google auf seiner Entwickler-Website erklärt.

von Google Erklärt:

// Gib mir alle Mitarbeiter mit Nachnamen gleich Smith oder Jones Abfrage query = pm.newQuery (Employee.class, ": p.contains (Name)") ; query.execute (Arrays.asList ("Smith", "Jones"));

Sicherlich sollte es sein:

// Gib mir alle Mitarbeiter mit Nachnamen gleich Smith oder Jones Abfrage query = pm.newQuery (Employee.class, „p.contains (: nachName) "); query.execute (Arrays.asList ("Smith", "Jones"));

+0

Das Dokument ist korrekt. Das ": p" ist Ihre Liste, und Sie suchen nach Objekten, deren "lastName" in Ihrer Liste enthalten ist, daher . Contains (). – opowell