2010-01-07 23 views

Respuesta

2

No es una respuesta directa, por como alternativa a getObjectsById, parece que se puede utilizar 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); 
} 

Al parecer, esta consulta se optimiza el uso de un API eficiente a granel de bajo nivel.

Sin embargo, el orden de las claves se pierde, por lo que deberá volver a ordenar el resultado en Java.

+0

no soy capaz de hacer que funcione: Problema con la consulta : Método no compatible al analizar la expresión:. InvokeExpression {[ParameterExpression {llaves}] contiene (VariableExpression {key})} –

3

Uso PersistenceManager.newObjectIdInstance(), como tal

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

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

no estoy seguro de lo caro sin embargo la llamada a newObjectIdInstance es (no debería ser por lo que puedo ver).

+0

¡Es muy caro! – Sam

+0

@Sam, ¿con qué alternativa se está comparando? ¿Es más caro que la solución de Thilo? ¿Cómo está evaluando qué tan costosa es esta llamada? – Price

0

La respuesta sobre mí es casi correcta.

Parece haber un error en la sintaxis explicada por Google en su sitio web de desarrolladores.

explica por Google:

// Dame todos los empleados con lastName igual a Smith o consulta Jones consulta = pm.newQuery (Employee.class, ": p.contains (lastName)") ; query.execute (Arrays.asList ("Smith", "Jones"));

Sin duda que debe ser:

// Dame todos los empleados con lastName igual a Smith o consulta Jones consulta = pm.newQuery (Employee.class, "p.contains (: lastName) "); query.execute (Arrays.asList ("Smith", "Jones"));

+0

El documento es correcto. El ": p" es su lista, y está buscando objetos cuyo "apellido" está en su lista, por lo tanto, .contains (). – opowell