Google App Engine数据存储-如何高效地从Java子表的键中选择父实体?
我正在尝试将这个Python代码从演示文稿翻译成Java , GAEJ是否支持这样做Google App Engine数据存储-如何高效地从Java子表的键中选择父实体?,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我正在尝试将这个Python代码从演示文稿翻译成Java , GAEJ是否支持这样做 indexes = db.GqlQuery( "SELECT __key__ FROM MessageIndex " "WHERE receivers = :1", me) keys = [k.parent() for k in indexes] messages = db.get(keys) 下面是我的Java实现。这些功能和性能是否等效?如果我有大量的钥匙会发生什么 Query query1 = new
indexes = db.GqlQuery( "SELECT __key__ FROM MessageIndex " "WHERE receivers = :1", me)
keys = [k.parent() for k in indexes]
messages = db.get(keys)
下面是我的Java实现。这些功能和性能是否等效?如果我有大量的钥匙会发生什么
Query query1 = new Query("MessageIndex");
query1.setKeysOnly();
query1.addFilter("receivers", FilterOperator.EQUAL, me);
PreparedQuery pq2 = datastore.prepare(query1);
Iterable<Entity> entities = pq2.asIterable();
HashSet<Key> keys = new HashSet<Key>();
for (Entity en : entities)
keys.add(en.getParent());
Query query2 = new Query("Messages");
query2.addFilter("__key__", FilterOperator.IN, keys);
queryquery1=新查询(“MessageIndex”);
query1.setKeysOnly();
查询1.addFilter(“接收器”,FilterOperator.EQUAL,me);
PreparedQuery pq2=数据存储。prepare(query1);
Iterable entities=pq2.asIterable();
HashSet keys=新的HashSet();
对于(实体en:实体)
添加(en.getParent());
查询查询2=新查询(“消息”);
query2.addFilter(“\uuuuu key\uuuuuu”,FilterOperator.IN,key);
查看数据存储服务API
DatastoreService.get(键)比使用键的查询效率更高。正如@Rick已经指出的,get比查询更快、更便宜。您只需要更改代码的最后一部分。而不是:
Query query2 = new Query("Messages");
query2.addFilter("__key__", FilterOperator.IN, keys);
只要做:
Map<Key,Entity> messages = datastore.get(keys);
Map messages=datastore.get(键);
您是否考虑过使用Objectify?与JDO或JPA相比,它的痛苦要小得多。上面的代码片段与objectify的等价物是什么?我自己不使用Java,所以我不能说——但是objectify文档有很多例子。