【问题标题】:Google App Engine Query Not Working in JavaGoogle App Engine 查询在 Java 中不起作用
【发布时间】:2016-01-03 23:36:28
【问题描述】:

在 Stackoverflow 上给我解惑:

我有一个查询要发送给 GAE。查询(字符串格式时)如下所示: 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

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

【问题讨论】:

  • countEntities()deprecatedasSingleEntity() 带给你什么?
  • 它确实已被弃用,它仍然有效,但可能应该提到(就像你所做的那样)它已被弃用,以防它在未来被完全删除。

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


【解决方案1】:

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,则查询只是准备好并且不会运行

【讨论】:

  • 虽然这对我的具体问题没有帮助,但您提出了一个很好的观点,要实际利用存储在 pq 中的实体,您确实需要针对它调用一个方法,然后遍历结果。我在上面发布了解决方案;原来这是一个选角问题。
【解决方案2】:

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

问题围绕正在设置的过滤器展开。如果我删除了过滤器,它工作正常(但返回了所有内容)。事实证明,作为过滤器传递的是 user_id 的 String 版本,而不是它的 Long 版本。当我打印它时,真的没有办法知道确切的 SQL 查询没有读取( SELECT * FROM USER WHERE USER_ID = "5884677008" ),这将是一个死的赠品。

我将传递的过滤器参数(我存储在 (String, Object) btw 的哈希映射中)从 String 更改为 Long,从而解决了问题。

有一点需要指出,正如@Patrice 提出的(并且我在发布时排除了我的代码以节省空间),要实际遍历结果列表,您确实需要针对它调用一个方法(要么.asIterable() 或 .asSingleEntity() )。

您实际上可以通过调用 pq.countEntities() 检查返回的实体/结果的数量,甚至在您针对 pq 调用格式化方法之前它也会返回正确的数字,但正如@tx802 指出的那样,它已被弃用,尽管它对我有用,但将来使用这篇文章作为参考的人可能不会让它对他们有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多