appenginejava:用于设置查询限制和开始偏移量的语法。
我在GAE数据存储中有一个游戏列表,我想查询固定数量的游戏,从某个偏移量开始,即获取id为“75”的下一个25个游戏开始表单条目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.
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>");
}
}