Google Cloud Datestore - невозможно использовать курсоры в Objectify v5 - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь использовать курсоры в Objectify v5, но, следуя примеру, я получаю исключение.

Мой код:

import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.api.datastore.QueryResultIterator;

Query<IndicadorEntity> query = ofy().load().type(IndicadorEntity.class).limit(1000);
query.startAt(Cursor.fromWebSafeString("1"));
final List<IndicadorEntity> indicadorEntities = new ArrayList<>();
QueryResultIterator<IndicadorEntity> iterator = query.iterator();

while (iterator.hasNext()) {
      indicadorEntities.add(iterator.next());
}

и получаю следующее исключение :

java.lang.IllegalArgumentException: Unable to decode provided cursor.
[INFO] GCLOUD:  at com.google.appengine.api.datastore.Cursor.fromWebSafeString(Cursor.java:115)

Что не так? Я не могу найти ни одной подобной проблемы в Google, и я просто последовал примеру здесь.

РЕДАКТИРОВАТЬ1: ВОЗВРАТ ЗАПРОСА И ПУСТОЙ КУРСОР

final IndicadorEntityCursor indicadorEntityCursor = new IndicadorEntityCursor();
Query<IndicadorEntity> query =  ofy().load().type(IndicadorEntity.class)
                        .filter(FILTRO_CAMPANA, this.getCampannaEntity(campanna))
                        .filter(FILTRO_FECHA_BAJA, null)
                        .limit(Constantes.DATASTORE_LIMIT)
                        .order("titulo");

if (cursor != null) {
   query = query.startAt(Cursor.fromWebSafeString(cursor));
}

indicadorEntityCursor.setIndicadores(query.list());
                indicadorEntityCursor.setCursor(query.iterator().getCursor().toWebSafeString());

return this.indicadorCursorMapper.map(indicadorEntityCursor);

Спасибо.

1 Ответ

2 голосов
/ 21 февраля 2020

Здесь происходят две вещи. Одна проблема заключается в следующем:

query.startAt(Cursor.fromWebSafeString("1"));

Должно быть так:

query = query.startAt(Cursor.fromWebSafeString("1"));

API Objectify построен в функциональном стиле. Промежуточные объекты запроса являются неизменяемыми; метод startAt возвращает новый промежуточный объект запроса, который начинается с этого значения курсора и не изменяет состояние в другом объекте.

Однако это не является причиной вашего исключения. Причиной вашего исключения является именно то, что говорится: «1» не является строкой курсора. Вы должны получить строки курсора, получив объект Cursor и вызвав на нем toWebSafeString(). Возможно, вам нужен метод запроса offset()?

...