谷歌应用程序引擎查询不工作在Java

问题描述:

谜语我这个问题我有一个查询,我发送到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

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

花了相当多的测试,但发现问题。

该问题围绕着设置的过滤器而展开。如果我删除了过滤器,它工作正常(但返回所有内容)。原来,作为过滤器传递的是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指出的那样不推荐使用,尽管它对我有用,但将来有人将此文章作为参考,可能不适合他们。