Google app engine 使用游标将分页对象化

Google app engine 使用游标将分页对象化,google-app-engine,pagination,cursor,objectify,Google App Engine,Pagination,Cursor,Objectify,我的RPC服务中有此方法: @Override public Entrata[] getEntrate(int from, int to) { List<Entrata> data = entrateDao.list(); return data.toArray(new Entrata[0]); } @覆盖 public Entrata[]getEntrate(int-from,int-to){ 列表数据=entrateAO.List

我的RPC服务中有此方法:

@Override
    public Entrata[] getEntrate(int from, int to) {
        List<Entrata> data = entrateDao.list();
        return data.toArray(new Entrata[0]);
    }
@覆盖
public Entrata[]getEntrate(int-from,int-to){
列表数据=entrateAO.List();
返回数据.toArray(新的Entrata[0]);
}
如您所见,我没有使用这两个参数,在SQL世界中,我将使用这两个参数作为限制和偏移量

现在还不完全清楚我要做什么,我开始读到:

我想我必须做一个查询

然后迭代“到”次,即页面大小

好吗?你能帮我写一些片段吗?:)

来自文档:游标允许您在查询结果集中获取一个“检查点”,将该检查点存储在其他位置,然后从您最后离开的位置继续

由于您只需要限制/偏移,因此必须使用Objectify查询的
limit()
offset()
方法。比如:

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);
String cursor=//从请求中获取它
Query Query=ob.Query(Entrata.class);
Query q=Query.startCursor(Cursor.fromWebSafeString(Cursor));
q、 极限(x);
QueryResulterator迭代器=query.iterator()
列表数据=//获取数据
字符串newCursor=iterrator.getStartCursor().TowersFestring()
返回新的EntrataListWithCursor(数据,cursor);

我只想确保您的代码中没有任何错误,因为您可以复制并通过Igor Artamonov代码。 以下是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()));
}
//创建查询并将限制设置为1000
Query Query=ofy().load().type(Car.class).limit(1000);
//在这里,您可以从请求中获得游标(如果存在)
//对于第一个请求,即第一页,此参数(游标)将为null
字符串cursorStr=request.getParameter(“游标”);
//在这里,您可以检查游标是否不为null和不为空
//如果是这样,我们从最后一个检查点开始查询
if(cursorStr!=null&!cursorStr.isEmpty())
query=query.startAt(Cursor.fromWebSafeString(cursorStr));
//我们需要这个变量来知道何时加载了所有条目
布尔剩余=假;
QueryResulterator迭代器=query.iterator();
while(iterator.hasNext()){
Car=iterator.next();
…//您的代码在这里
//我们已找到条目,因此将此变量设置为true。
//也就是说,我们可能还有另一页要拿
剩余=真;
}
//如果找到条目,我们将发送最后一个检查点
如果(剩余){
//我们通过从迭代器的游标调用“towerbsafesting()”来获取最后一个检查点
Cursor Cursor=iterator.getCursor();
Queue Queue=QueueFactory.getDefaultQueue();
add(url(“/pathToThisServlet”).param(“cursor”,cursor.towerbsafesting());
}

效率不高,抱歉,我已经知道我正在尝试构建一个可以处理超过10亿条记录的应用程序:-\n如果你知道游标,有没有办法让它们具有极限偏移行为?如果你已经有游标,你可以从游标开始(游标只是一个序列化的位置)。你打算如何使用这种方法?你说的“已经有了”是什么意思?那么,让我们假设我的页面大小是15。第一个请求,游标为null,因此我迭代数据集的前15个元素。然后我抓取光标并将其保存在某个位置,例如客户端的信息。下一次读取游标时,对吗?好的,所以第一次我将执行“完整”查询并仅迭代15次,然后保存游标并将其与数据一起返回给客户端。第二次。。。类似于您的代码的东西。谢谢:)我很快就要试试了!