appenginejava:用于设置查询限制和开始偏移量的语法。

appenginejava:用于设置查询限制和开始偏移量的语法。,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我在GAE数据存储中有一个游戏列表,我想查询固定数量的游戏,从某个偏移量开始,即获取id为“75”的下一个25个游戏开始表单条目 PersistenceManager pm=PMF.get().getPersistenceManager();//来自谷歌的例子 Query Query=pm.newQuery(Game.class);//类游戏的对象存储在数据存储中 query.setOrdering(“creationDate asc”); /*正在查询未由该玩家创建的开放游戏*/ query.

我在GAE数据存储中有一个游戏列表,我想查询固定数量的游戏,从某个偏移量开始,即获取id为“75”的下一个25个游戏开始表单条目

PersistenceManager pm=PMF.get().getPersistenceManager();//来自谷歌的例子
Query Query=pm.newQuery(Game.class);//类游戏的对象存储在数据存储中
query.setOrdering(“creationDate asc”);
/*正在查询未由该玩家创建的开放游戏*/
query.setFilter(“state==Game.state\u OPEN&&serverPlayer.id!=:playerId”);
String playerId=“我的玩家id”;
List games=query.execute(playerId);//若有很多游戏,返回的列表中有比用户每次需要看到的更多的条目
//...
现在我需要扩展这个查询,只获取25个游戏,以及id为“75”的条目之后的游戏。因此,用户可以浏览打开的游戏,一次只能获取25个。 我知道有很多关于GAE数据存储的例子,但是这些都是用Python编写的,包括设置查询限制的示例代码。
我正在寻找一个可用的Java代码示例,但到目前为止还没有找到。

听起来您希望通过查询游标方便分页。见:

发件人:

公共类ListPeopleServlet扩展了HttpServlet{
@凌驾
受保护的无效数据集(HttpServletRequest-req、HttpServletResponse-resp)
抛出ServletException、IOException{
DatastoreService datastore=DatastoreServiceFactory.getDatastoreService();
查询q=新查询(“人员”);
PreparedQuery pq=数据存储。prepare(q);
int pageSize=15;
分别为setContentType(“文本/html”);
响应getWriter()println(“
    ”); FetchOptions FetchOptions=FetchOptions.Builder.withLimit(页面大小); 字符串startCursor=req.getParameter(“游标”); //如果这个servlet被传递了一个游标参数,那么让我们使用它 if(startCursor!=null){ fetchOptions.startCursor(Cursor.fromWebSafeString(startCursor)); } QueryResultList结果=pq.asQueryResultList(fetchOptions); 对于(实体:结果){ resp.getWriter().println(“
  • ”+entity.getProperty(“名称”)+“
  • ”); } 分别为getWriter()println(“
”); 字符串cursor=results.getCursor().towerbsafesting(); //假设这个servlet位于'/people' resp.getWriter().println( ""); } }
谢谢大家的帮助。诅咒者是正确的答案。
问题是我几乎被JDO卡住了,无法使用DatastoreService,所以我终于找到了以下链接:

嗯。。。看起来像我需要的,但有一个限制:不能将游标用于使用IN或!=过滤器操作符。这个例子使用的是另一个API,不是Persistence Manager,但这应该不是问题,我会试试这个,看看它是否适合我。谢谢,这比文档更清晰!为什么他们不能只提供一个代码示例?好的,但是为什么一旦光标设置为fetchOptions,getOffset、getPrefetchSize、getChunkSize返回null?使用不相等查询过滤(我认为是)单个结果是浪费资源-SDK必须执行两个查询才能满足这一要求。相反,从返回的结果集中过滤掉你不想要的单个结果。最多可以有5个游戏,属于有问题的玩家。但实际上,当查询数百个游戏时,1或5没有区别,所以你明白了,我将把“!=”逻辑移出查询。
PersistenceManager pm = PMF.get().getPersistenceManager(); // from Google examples
Query query = pm.newQuery(Game.class); // objects of class Game are stored in datastore
query.setOrdering("creationDate asc");
/* querying for open games, not created by this player */
query.setFilter("state == Game.STATE_OPEN && serverPlayer.id != :playerId");
String playerId = "my-player-id";
List<Game> games = query.execute(playerId); // if there's lots of games, returned list has more entries, than user needs to see at a time
//...
public class ListPeopleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {

        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Query q = new Query("Person");
        PreparedQuery pq = datastore.prepare(q);
        int pageSize = 15;

        resp.setContentType("text/html");
        resp.getWriter().println("<ul>");

        FetchOptions fetchOptions = FetchOptions.Builder.withLimit(pageSize);
        String startCursor = req.getParameter("cursor");

        // If this servlet is passed a cursor parameter, let's use it
        if (startCursor != null) {
            fetchOptions.startCursor(Cursor.fromWebSafeString(startCursor));
        }

        QueryResultList<Entity> results = pq.asQueryResultList(fetchOptions);
        for (Entity entity : results) {
            resp.getWriter().println("<li>" + entity.getProperty("name") + "</li>");
        }
        resp.getWriter().println("</ul>");

        String cursor = results.getCursor().toWebSafeString();

        // Assuming this servlet lives at '/people'
        resp.getWriter().println(
            "<a href='/people?cursor=" + cursor + "'>Next page</a>");
    }
}