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()
方法?
我正在尝试在 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()
方法?