Google App Engine DataStore - 如何以高效的方式从Java中的子表的键中选择父实体?

时间:2012-04-08 01:08:00

标签: java google-app-engine google-cloud-datastore

我正在尝试将此Python代码从演示文稿转换为Java Building Scalable, Complex Apps on App Engine

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

2 个答案:

答案 0 :(得分:1)

正如@Rick已经指出的,获取比查询更快更便宜。您只需要更改代码的最后一部分。而不是:

Query query2 = new Query("Messages");
query2.addFilter("__key__", FilterOperator.IN, keys);

只是这样做:

Map<Key,Entity> messages = datastore.get(keys);

答案 1 :(得分:0)

查看DatastoreService API https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService

DatastoreService.get(keys)比使用键的查询更有效。