【问题标题】:Retrieve TOP 1 on Google App Engine在 Google App Engine 上检索 TOP 1
【发布时间】:2011-08-25 12:42:00
【问题描述】:

如何从 Google App Engine 上的查询中仅检索一个实体。我正在使用 ORDER BY 创建查询并使用:

List<Object> objs= (List<Object>) pm.newQuery(query).execute();
if (objs.size() > 0) {
    obj= objs.get(0);
}

但是,当我在数据库中有大量“Obj”时,查询成本太高,而且我的延迟也太大。

还有其他方法可以进行此查询吗?

【问题讨论】:

  • 为什么不只是无条件地调用 .get() 并捕获异常或检查 null 如果对象不存在?调用 size 计算整个结果集。

标签: java google-app-engine jdo


【解决方案1】:

看看this document

这些是查询的有效用法:

// Construct then prepare your query
List<Entity> get5TallestPeople() {
    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
    Query q = new Query("Person");
    q.addSort("height", SortDirection.DESCENDING);
    PreparedQuery pq = ds.prepare(q);
    return pq.asList(FetchOptions.Builder.withLimit(5));
}

return pq.asList(FetchOptions.Builder.withLimit(5).offset(5)));

在你的情况下,我猜你可以使用后一种语法。

它使用低级 Java API 而不是 JDO,但它不应该阻止您使用它。

【讨论】:

  • 他也可以通过设置查询范围来使用JDO查询,实现同样的目的
  • 使用 query.setRange(x, y) 方法为 JDO 查询设置范围。如果您寻找限制/光标,这有点难以找到。 This 是链接。
【解决方案2】:

您是否尝试过使用fetch 方法.. 这可以为您提供与top 1 相似的结果

【讨论】:

  • 但是如何在 Java GAE 中使用 fetch 呢?我在 Python 中看到了这个 API(在文档中),但在 Java 中没有看到。 :(
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2016-05-25
  • 2011-05-23
  • 2021-06-06
  • 2012-08-26
  • 2011-02-10
相关资源
最近更新 更多