App Engine Java: синтаксис для установки предела запроса и начального смещения. - PullRequest
2 голосов
/ 29 июля 2011

У меня есть список игр в хранилище данных GAE, и я хочу запросить их фиксированное количество, начиная с определенного смещения, то есть получить следующие 25 игр, начиная с формы ввода с идентификатором «75».

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
//...

Теперь мне нужно расширить этот запрос, чтобы получить только 25 игр и только игры после записи с идентификатором "75". Таким образом, пользователь может просматривать открытые игры, выбирая только 25 из них одновременно. Я знаю, что есть много примеров для хранилища данных GAE, но все они в основном на Python, включая пример кода для установки ограничения для запроса. Я ищу пример работающего кода Java и пока не смог его найти.

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

Звучит так, как будто вы хотите облегчить разбиение по страницам с помощью курсоров запросов. Смотри: http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors

С Документ Google :

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>");
    }
}
0 голосов
/ 29 июля 2011

Спасибо всем за помощь.Курсоры были правильным ответом.Дело в том, что я в значительной степени застрял в JDO и не могу использовать DatastoreService, поэтому я наконец-то нашел эту ссылку: http://code.google.com/appengine/docs/java/datastore/jdo/queries.html#Query_Cursors

...