Объективировать пейджинг с помощью курсоров - PullRequest
9 голосов
/ 11 августа 2011

У меня есть этот метод в моей службе RPC:

@Override
    public Entrata[] getEntrate(int from, int to) {
        List<Entrata> data = entrateDao.list();
        return data.toArray(new Entrata[0]);
    }

Как видите, я не использую два параметра, которые в мире SQL я бы использовал как LIMIT и OFFSET.

Не совсем понятно, что мне теперь делать, я начал читать это: http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

Я думаю, мне нужно сделать query.startCursor ()

Затем итерируйте время "TO", размер страницы.

Хорошо? Можете ли вы помочь мне с некоторыми фрагментами? :)

Ответы [ 2 ]

15 голосов
/ 11 августа 2011

Из документов: Курсоры позволяют вам взять «контрольную точку» в наборе результатов запроса, сохранить контрольную точку в другом месте, а затем возобновить с того места, где вы остановились позднопредел / смещение, вы должны использовать limit() и offset() метод Objectify Query.Как:

ob.query(Entrata.class).limit(to - from).offset(from)

Или, когда у вас есть курсор:

String cursor = // get it from request
Query<Entrata> query = ob.query(Entrata.class);
Query q = query.startCursor(Cursor.fromWebSafeString(cursor));
q.limit(x);
QueryResultIterator<Entrate> iterator = query.iterator()
List<Entrate> data = // fetch data
String newCursor = iterrator.getStartCursor().toWebSafeString()
return new EntrataListWithCursor(data, cursor);
0 голосов
/ 13 октября 2018

Я просто хочу убедиться, что в вашем коде нет ошибок, так как вы можете копировать и вставлять код Игоря Артамонова.Вот более чистый код от Objectify Wiki с меньшим количеством ошибок и некоторой документацией:

// create the query and set the limit to 1000
Query<Car> query = ofy().load().type(Car.class).limit(1000);

// Here you get the cursor (if exists) from the request
// For the first request, i-e the first page, this parameter(cursor) will be null
String cursorStr = request.getParameter("cursor");

// Here you check if cursor is not null and not empty
// If so, we start our query from the last check point
if (cursorStr != null && !cursorStr.isEmpty())
    query = query.startAt(Cursor.fromWebSafeString(cursorStr));

// We need this variable to know when we have been loaded all the entries
boolean remaining = false;
QueryResultIterator<Car> iterator = query.iterator();
while (iterator.hasNext()) {
    Car car = iterator.next();

    ... // your code here

    // We have found entries, so we set this variable to true.
    // That means, we have probably another page to fetch
    remaining = true;
}

// If we have found entries, we send the last check point
if (remaining) {
    // we take the last check point by calling "toWebSafeString()" from the iterator's cursor
    Cursor cursor = iterator.getCursor();
    Queue queue = QueueFactory.getDefaultQueue();
    queue.add(url("/pathToThisServlet").param("cursor", cursor.toWebSafeString()));
}
...