5

JDO によると、PersistenceManager.getObjectsByIdを使用して、複数のエンティティ インスタンスをオブジェクト ID でロードできます。

ここで使用する必要があるコレクションの種類は何ですか? Google データ ストア キーはオブジェクト ID として機能しません。

4

3 に答える 3

3

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 への呼び出しがどれほど高価かはわかりません (私が見ることができるものではないはずです)。

于 2011-02-02T21:41:24.107 に答える
2

の代わりに、 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 ランドで結果を再ソートする必要があります。

于 2010-01-07T02:06:55.270 に答える
0

私の上の答えはほぼ正しいです。

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"));

于 2012-12-27T13:36:16.630 に答える