Google App Engine查询无法在Java中运行

时间:2015-10-06 21:49:01

标签: java google-app-engine google-cloud-datastore gql

在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

编辑:我确实已经建立了索引,但它似乎没有帮助解决问题。

2 个答案:

答案 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指出的那样,它已被弃用,尽管它对我有用,但将来使用这篇文章作为参考的人可能不适合他们。