Pagination in Google App Engine with Java

后端 未结 4 431
攒了一身酷
攒了一身酷 2021-01-12 11:23

I need to create simple pagination of objects, but when I read manual I found out that query.setRange(5, 10); will fetch 10 objects, even when only 5 objects are needed.

相关标签:
4条回答
  • 2021-01-12 11:34

    How about this:

    List<Employee> results = (List<Employee>) query.execute();
    // Use the first 20 results...
    
    Cursor cursor = JPACursorHelper.getCursor(results);
    String cursorString = cursor.toWebSafeString();
    // Store the cursorString...
    
    // ...
    
    // Query query = the same query that produced the cursor
    // String cursorString = the string from storage
    Cursor cursor = Cursor.fromWebSafeString(cursorString);
    query.setHint(JPACursorHelper.CURSOR_HINT, cursor);
    query.setRange(0, 20);
    
    List<Employee> results = (List<Employee>) query.execute();
    // Use the next 20 results...
    

    From:

    How to use datastore cursors with jpa on GAE

    Also:

    http://groups.google.com/group/google-appengine-java/browse_thread/thread/5223215ff24c3b3e/d22297d1d76a9c8b

    Or without JPA see:

    http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Cursor.html

    0 讨论(0)
  • 2021-01-12 11:41

    There's an article about this very topic on the App Engine site:

    http://code.google.com/appengine/articles/paging.html

    The examples are in Python, but they're simple enough that you can probably translate to Java fairly easily.

    Here's a Java implementation, which I have not read or tested.

    0 讨论(0)
  • 2021-01-12 11:42

    You probably want to look into using cursors rather than setRange, if you are trying to do pagination.

    0 讨论(0)
  • 2021-01-12 11:48

    Why is it a problem if 10 objects are returned from the database? You will still be returned just the 5 objects that you care about (the first 5 are discarded).

    I'm not asking because I think the setRange method is a solution that scales incredibly well, but it is a simple and reasonable solution that is more than adequate in a good number of cases.

    Are you planning on paging extremely large tables or incorporate expensive joins? If not, I'd be tempted to use setRange as the starting point for your pagination.

    0 讨论(0)
提交回复
热议问题