2015-10-06 103 views
1

謎語我這個問題我有一個查詢,我發送到GAE。查詢(當以字符串格式)如下所示: SELECT * FROM USER WHERE USER_ID = 5884677008谷歌應用程序引擎查詢不工作在Java

如果我轉到GAE控制檯並通過手動GQL查詢鍵入它,它將返回該項目就好了。如果我通過GUI瀏覽並滾動到它,我可以看到它很好。但是當我從Java代碼中調用它時,它不會每次都返回。 代碼:

我已經確認查詢是正確的,因爲我將它打印爲字符串,所以我可以測試它。

任何人都知道這是怎麼回事?

q = new Query(entityName); //entityName = "User", confirmed 
    q.setFilter(filter); //filter = "USER_ID = 5884677008", confirmed 
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
    PreparedQuery pq = datastore.prepare(q); 
    /* 
    This always is empty here. Calling either pq.countEntities()); or 
    pq.toString()); returns size 0 or a String of nothing. 
    */ 

謝謝! -Sil

編輯:我是否建立了索引,但它似乎沒有幫助解決問題。

+1

'countEntities()'[已棄用](https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/PreparedQuery)。 'asSingleEntity()'給你什麼? – tx802

+0

它確實被棄用,它仍然有效,但可能應該提及(如你所做的那樣),以防它在未來完全被刪除的情況下被棄用。 – Silmarilos

回答

2

docs,你不一定需要做toString。你在pq上試過asIterable或asSingleEntity嗎?例如:

PreparedQuery pq = datastore.prepare(q); 

for (Entity result : pq.asIterable()) { 
    String test = (String) result.getProperty("prop1"); 
} 

這就是如果你有多個條目。在事件中,你只有一個:

PreparedQuery pq = datastore.prepare(q); 

Entity result = pq.asSingleEntity(); 
String test = (String) result.getProperty("prop1"); 

基本上,如果你不叫asIterable或asSingleEntity,查詢已經準備就緒,並且不運行

+0

儘管這對我的具體問題沒有幫助,但您提出了一個很好的觀點,要真正利用存儲在pq中的實體,您需要調用一個方法來對它進行迭代,然後遍歷結果。我發佈了上面的解決方案;原來這是一個鑄造問題。 – Silmarilos

2

花了相當多的測試,但發現問題。

該問題圍繞着設置的過濾器而展開。如果我刪除了過濾器,它工作正常(但返回所有內容)。原來,作爲過濾器傳遞的是user_id的String版本,而不是Long版本。當我打印它時,實際上沒有辦法將其作爲確切的SQL查詢DID NOT READ(SELECT * FROM USER WHERE USER_ID =「5884677008」),這本來是一個死牌。

我改變了傳遞的過濾器參數(我將其存儲在(String,Object)btw)的hashmap中,從String轉換爲Long並解決了這個問題。

有一點需要注意,就像@Patrice提出的那樣(並且爲了節省空間,我從代碼中排除),實際上遍歷結果列表,您確實需要調用一個方法來抵抗它( .asIterable()或.asSingleEntity())。

實際上,您可以通過調用pq.countEntities()來檢查返回的實體/結果的數量,即使在您針對pq調用格式化方法之前,它也會返回正確的數字,但正如@ tx802指出的那樣不推薦使用,儘管它對我有用,但將來有人將此文章作爲參考,可能不適合他們。