【问题标题】:JDO Query with cursors on GAE returns same cursor在 GAE 上带有游标的 JDO 查询返回相同的游标
【发布时间】:2016-03-14 14:48:09
【问题描述】:

我正在尝试在我的 GAE 查询中实现分页,这就是我的目标:

public JSONArray getDeviceListByTypeWithCursor(String cursorString) {

    PersistenceManager pm = persistenceManagerFactory.getPersistenceManager();

    Query q = pm.newQuery(MobileDevice.class);
    q.setRange(0, 100);
    if(cursorString != "" && cursorString != null){
        Cursor cursor;
        try{
            cursor = Cursor.fromWebSafeString(cursorString);
            Map<String, Object> extensionMap = HashMap<String, Object>();
            extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
            q.setExtensions(extensionMap);
        }catch(Exception e){
            cursor = null;
        }
    }
    JSONArray array = new JSONArray();

    List<MobileDevice> results = (List<MobileDevice>) q.execute();
    for (MobileDevice device : results) {
        array.put(device.toJSON());
    }
    Cursor cursor = JDOCursorHelper.getCursor(results);
    cursorString = cursor.toWebSafeString();
    array.put(cursorString);
    return array;
}

当我发送一个空 cursorString 时,我得到了前 100 个结果 + 预期的新光标。 但是,当我使用新光标发送另一个请求时,我得到了正确的结果 (#101-#200),但光标字符串相同。

数据存储区有很多实体(超过 100000 个),因此这可能不是由于结果结束所致。

更新

我开始意识到这可能是由于 Spring 框架的问题。我们使用的是 Spring 4.2.3 - 但我在网上没有看到任何关于使用 Spring 和 GAE 的信息,更不用说 Spring+GAE+Cursors..

【问题讨论】:

  • 你检查了这段代码中的String是否相同,还是你检查了客户端?
  • Both.. 无论我是否发送空游标,它总是相同的 cursorString
  • cursorString != "" 不是有效代码。应该是cursorString != null &amp;&amp; !cursorString.equals(""))
  • 你是对的(迁移到 Java 有时很困难..),但不幸的是,事实并非如此
  • 从异常中删除 cursor = null - 它不应该发生。在那里放一个日志语句来检查你是否真的有异常。

标签: java spring google-app-engine jdo


【解决方案1】:

所以我在执行查询后添加了一个results.size() 调用(我还删除了对结果进行迭代的循环),这似乎解决了我的问题。希望这对其他人有所帮助!

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2012-11-29
    相关资源
    最近更新 更多