JDO によると、PersistenceManager.getObjectsByIdを使用して、複数のエンティティ インスタンスをオブジェクト ID でロードできます。
ここで使用する必要があるコレクションの種類は何ですか? Google データ ストア キーはオブジェクト ID として機能しません。
JDO によると、PersistenceManager.getObjectsByIdを使用して、複数のエンティティ インスタンスをオブジェクト ID でロードできます。
ここで使用する必要があるコレクションの種類は何ですか? Google データ ストア キーはオブジェクト ID として機能しません。
PersistenceManager.newObjectIdInstance() などを使用します。
List<Object> ids = new ArrayList<Object>();
for (Key key : keys) {
ids.add(pm.newObjectIdInstance(Foo.class, key));
}
return (List<Foo>) pm.getObjectsById(ids);
ただし、 newObjectIdInstance への呼び出しがどれほど高価かはわかりません (私が見ることができるものではないはずです)。
の代わりに、 JDOQLクエリをgetObjectsById
使用して複数のエンティティをキーでロードできるようです:
public List getById(List keys) {
Query q = pm.newQuery(
"select from " + Book.class.getName() + " where :keys.contains(key)");
return (List) q.execute(keys);
}
どうやら、このクエリは効率的な低レベルのバルク API を使用するように最適化されています。
ただし、キーの順序は失われるため、Java ランドで結果を再ソートする必要があります。
私の上の答えはほぼ正しいです。
Google が開発者の Web サイトで説明している構文に誤りがあるようです。
グーグルによる説明:
// lastName が Smith または Jones と等しいすべての Employees を指定してください。 Query query = pm.newQuery(Employee.class, ":p.contains(lastName)"); query.execute(Arrays.asList("Smith", "Jones"));
確かにそれはあるべきです:
// lastName が Smith または Jones と等しいすべての Employees を指定してください。 Query query = pm.newQuery(Employee.class, "p.contains(:lastName)"); query.execute(Arrays.asList("Smith", "Jones"));