在Stackoverflow上谜语:
我有一个查询,我发送给GAE。查询(以String格式表示)如下所示: SELECT * FROM USER WHERE USER_ID = 5884677008
如果我转到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
编辑:我确实已经建立了索引,但它似乎没有帮助解决问题。
答案 0 :(得分: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,则查询已准备好并且无法运行
答案 1 :(得分:2)
进行了相当多的测试,但发现了问题。
问题围绕着设置的过滤器。如果我删除过滤器,它工作正常(但返回一切)。事实证明,作为过滤器传递的是user_id的String版本,而不是它的Long版本。当我打印它时,确实没有办法告诉确切的SQL查询DID NOT NOT(SELECT * FROM USER WHERE USER_ID =“5884677008”),这本来是一个死的赠品。
我将传递的filter参数(我已经存储在(String,Object)btw的hashmap中)从String更改为Long,这解决了问题。
有一点需要注意的是,正如@Patrice提出的那样(并且当我在发布以节省空间时从我的代码中排除),要实际遍历结果列表,你需要调用一个方法来反对它(要么.asIterable()或.asSingleEntity())。
你实际上可以通过调用pq.countEntities()来检查返回的实体/结果的数量,它甚至会在你对pq调用格式化方法之前返回正确的数字,但正如@ tx802指出的那样,它已被弃用,尽管它对我有用,但将来使用这篇文章作为参考的人可能不适合他们。