【问题标题】:Query Cursor with App Engine (Java - JDO)使用 App Engine 查询游标 (Java - JDO)
【发布时间】:2023-04-07 00:57:02
【问题描述】:

我需要在我的结果获取中实现分页,所以在环顾四周时,我在 Google Developer 网站上获得了查询游标的链接,但文章解释了使用低级 API 的查询游标的使用(我避免这样的事情,例如瘟疫)。我在 JDO 上看到的所有内容都使用setRange(start, end),它(如果我是对的)效率不高,因为您仍然需要为获取和丢弃范围之前的结果所涉及的开销付出代价。 如何在 App Engine 数据存储之上的 JDO 中使用查询游标?

【问题讨论】:

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


    【解决方案1】:

    来自 appengine 文档:

    Query q = pm.newQuery(Person.class);
    q.setRange(0, 20);
    
    List<Person> results = (List<Person>) q.execute();
    // Use the first 20 results
    
    Cursor cursor = JDOCursorHelper.getCursor(results);
    

    https://developers.google.com/appengine/docs/java/datastore/jdo/queries

    然后,使用光标(也在提供的文档中,您应该阅读):

    String cursorString = cursor.toWebSafeString();
    // Send cursor around as string
    
    
    // Query q = the same query that produced the cursor;
    Cursor cursor = Cursor.fromWebSafeString(cursorString);
    Map<String, Object> extensionMap = new HashMap<String, Object>();
    extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
    q.setExtensions(extensionMap);
    q.setRange(0, 20); //note, the same range; 
    //the query should cover everything you expect to load.
    q.execute();
    

    【讨论】:

    • PS - 要使用游标,您必须请求比您想要的更多,并且您选择何时结束查询;要么你得到的结果少于一页,要么你得到更多,并选择提前结束(并将光标也发回以继续下一个查询)。使用查询块大小来避免请求超过一整页。此外,请注意使用不返回结果的查询的请求将发回用于构建查询的相同游标。空光标 = 没有结果。相同的光标 = 没有新结果。
    • 非常感谢。那么如何使用开始和结束光标 (JDO) 构造查询呢?
    • 更新了答案以包含示例用法。请注意,您需要设置相同的范围;完整的查询本身应该在您希望涵盖的完整范围内;光标允许您在中途停止,稍后再继续。
    • 非常感谢。我想您只向我展示了如何从上一个查询继续(即使用光标作为开始光标)。但这是我的应用程序中的一个用例:客户端已进行查询(快速更新数据(例如推文),现在应用程序只想获取新内容(即从数据的开头查询到最后一个点)游标,这意味着使用游标作为结束游标)。我在低级 GAE/J API 中看到过这个,但是我如何在 JDO 中做到这一点?
    • 这取决于您如何对数据进行排序。如果您按时间 ASC 排序,则新结果将超出光标的末尾。所以,查询时间 > userLatestKnownTime,范围 (0, 1000)。 userLatestKnownTime 的值将是查询所基于的新数据附近的某个固定点。在没有光标的情况下拉入第一页数据,并存储已知的最高时间。将其用于您的光标查询。如果您到达范围的末尾,只需更新最新的时间,然后开始一个新的光标。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多