2012-04-08 49 views
0

我試圖從表示 Building Scalable, Complex Apps on App Engine翻譯這個Python代碼到Java,Google App Engine DataStore - 如何以有效的方式從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); 
+0

你有沒有考慮使用客體?這比JDO或JPA更不痛苦。 – 2012-04-11 05:23:35

+0

與上面的代碼片斷相當的代碼是什麼? – 2012-04-11 14:41:55

+0

我自己並不使用Java,所以我不能真正說 - 但Objectify文檔有很多示例。 – 2012-04-11 23:43:16

回答

1

正如@Rick已經指出的那樣,獲取速度比查詢要快得多。你只需要改變你的代碼的最後一部分。相反的:

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

只是做:

Map<Key,Entity> messages = datastore.get(keys); 
相關問題