Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google App Engine数据存储-如何高效地从Java子表的键中选择父实体?_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google App Engine数据存储-如何高效地从Java子表的键中选择父实体?

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

我正在尝试将这个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 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文档有很多例子。