2010-03-18 82 views
3

我有大約50k實體存儲在appengine中。我能夠通過GQL管理界面查找單個記錄與查詢,如:如何在JDO中執行批量Google DataStore鍵查詢查詢

SELECT * FROM Pet where __key__ = KEY('Pet','Fido') 

,但我有麻煩找出如何通過JDO做的這一批版本。現在,我有這樣的:

PersistenceManager pm = ...; 
    for(Pet pet : pets) { 
     for(String k : getAllAliases(pet)) { 
      keys.add(KeyFactory.createKeyString(Pet.class.getSimpleName(), k)); 
     } 
    } 
    Query q = pm.newQuery("select from " + Pet.class.getName() + " where id == :keys"); 
    List<Pet> petlist = (List<Pet>) q.execute(keys); 

不過,雖然「菲多」的情況下GQL作品,當我使用的Java + JDO代碼它沒有返回。我究竟做錯了什麼?

回答

1

可能在JDOQL情況下不能正常工作,因爲它是無效的JDOQL :-P

 
Collection keys = ... (create your keys collection) 
Query q = pm.newQuery("SELECT FROM " + Pet.class.getName() + " WHERE :keys.contains(id)"); 

即過濾器使用Java語法

+0

很高興知道。如果查詢無效,我期待得到某種難以忽略的錯誤通知,所以我很失望。 – TheDon 2010-03-18 12:20:08

2

不要使用查詢獲取由關鍵實體 - 它們效率低下,需要爲每個檢索到的對象查詢!相反,get the objects by key。批量按鍵提取看起來不被JDO支持,但一次按鍵提取它們仍然比爲它們查詢更有效。

+0

我發現很難相信,通過key來單獨獲取實體會比執行JDO查詢更快。我會在某個時候嘗試實驗。 – TheDon 2010-03-26 01:25:14

+2

'IN'本身不受App Engine的本機支持--SDK通過執行多個順序查詢來模擬它。每個查詢都必須執行索引掃描,然後按鍵查找。相比之下,按鍵查找只需要做一小部分,因此速度要快得多。 – 2010-03-26 09:49:06