App Engine上的getObjectById

时间:2010-01-07 01:43:31

标签: java google-app-engine jdo datanucleus

根据JDO,您可以使用PersistenceManager.getObjectsById按对象ID加载多个实体实例。

在这里需要使用哪种系列? Google数据存储密钥不能用作对象ID。

3 个答案:

答案 0 :(得分: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的调用是多么昂贵(它不应该来自我所看到的)。

答案 1 :(得分:2)

不是直接的答案,作为getObjectsById的替代方案,您似乎可以使用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);
}

显然,此查询已经过优化,可以使用高效的低级批量API。

键的顺序确实会丢失,所以你必须在Java土地上重新排序结果。

答案 2 :(得分:0)

我上面的答案几乎是正确的。

Google在其开发者网站上解释的语法似乎存在错误。

谷歌解释:

  

//给我所有lastName等于Smith或Jones的员工       查询查询= pm.newQuery(Employee.class,                                 “:p.contains(lastName的)”);       query.execute(Arrays.asList(“Smith”,“Jones”));

当然应该是:

  

//给我所有lastName等于Smith或Jones的员工       查询查询= pm.newQuery(Employee.class,                                 “p.contains(:名字)”);       query.execute(Arrays.asList(“Smith”,“Jones”));