Google Cloud Datestore - 无法在 Objectify v5 上使用游标

Google Cloud Datestore - Can't use Cursors on Objectify v5

我正在尝试在 Objectify v5 上使用 Cursors,但是在按照示例操作时我抛出了异常。

我的代码:

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 上找不到任何类似的问题,我只是按照此处的示例进行操作。

EDIT1:查询返回和空光标

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);

谢谢。

这里发生了两件事。一个问题是:

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

需要这样:

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

Objectify 的 API 是以函数式风格构建的。中间查询对象是不可变的; startAt 方法 returns 一个新的中间查询对象,它从该游标值开始并且不会改变另一个对象中的状态。

但是,这不是您出现异常的原因。异常的原因正是它所说的:“1”不是游标字符串。您必须通过获取 Cursor 对象并对其调用 toWebSafeString() 来获取游标字符串。也许您需要查询 offset() 方法?