Thank you very much, Jeff. I'm so happy to learn those. I will definitely try the suggested library. Thanks.
On Sat, May 8, 2010 at 4:15 AM, Jeff Schnitzer <[email protected]> wrote: > This depends on what you mean by "lazily load" the entity. There are > at least three possible interpretations of lazy loading: > > 1) Lazily fetching data across the wire > 2) Lazily converting from protocol buffers to Entity objects > 3) Lazily translating Entity objects to Java POJOs > > The first two steps are encapsulated within the Low-Level API, the > third step is part of JDO/Objectify/etc. > > I know that when you issue a query, the results are batched in chunks > of a size that you can control. #1 and #2 are done together; the data > is pulled across the wire into materialized Entity objects in > increments of the batch size. > > Objectify does #3 at the last possible moment; if you do not call > next() and retrieve a POJO entity, the POJO will not be instantiated. > You can call hasNext() to determine the existence of another page and > this will not create a POJO - however, the Low-Level API will create > the Entity. > > In practice, it's hard to imagine that this matters unless your page > size is something like 2. If you have 20 elements on a page, the > worst-case scenario is that fetching 21 will add 5% to the cost of the > query. That's not much. > > You can do what you want with Objectify and I suspect you can do what > you want with JDO, just don't use getResultList(). Get an actual > QueryResultIterator so the getCursor() call will return the correct > location. > > Jeff > > On Thu, May 6, 2010 at 8:48 PM, Chau Huynh <[email protected]> wrote: > > Hi Jeff, > > > > With JPA I will need to excute getResultList() to get a collection > > > http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html#getResultList()<http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html#getResultList%28%29> > > Somehow org.datanucleus.store.appengine.query.getCursor(Iterator<?> iter) > > can not get the cursor in the middle of my iterator, a null value is > > returned in sample code below. > > I guess getCursor() has something to do with the List returned. > > > > EntityManager em = > > Query query = em.createQuery(queryString); > > query.setMaxResults(pageSize + 1); > > em.getTransaction().begin(); > > Iterator<TestEntity> iterator = query.getResultList().iterator(); > > List<TestEntity> list = new ArrayList<TestEntity>(); > > for (int i = 0; (i < pageSize) && iterator.hasNext(); i++) { > > list.add(iterator.next()); > > } > > Cursor cursor = JPACursorHelper.getCursor(iterator); > > // assert iterator.hasNext() == true and cursor == null > > em.getTransaction().rollback(); > > > > Just my curious: > > if I'm able to iterate through the result (using > > com.google.appengine.api.datastore.QueryResultIterator<T>) > > is it true that each iterator.hasNext() will lazily load entity from the > > data store? > > My concern is it might cost me more time that way than using > > Query.getResultList(). Please advise. > > > > Thank you. > > > > On Fri, May 7, 2010 at 2:24 AM, Jeff Schnitzer <[email protected]> > wrote: > >> > >> I'm a little confused by this. Why doesn't the OP's approach work? > >> > >> 1) Create query, fetch with limit of 21 items > >> 2) Iterate through 20 items > >> 3) Get cursor to be used for next page (if necessary) > >> 4) Iterate to 21st item just to check for existence > >> > >> Why won't this work? The documentation seems to imply that this is > >> how cursors work... > >> > >> Jeff > >> > >> On Thu, May 6, 2010 at 1:03 AM, Ikai L (Google) <[email protected]> > wrote: > >> > This is a datastore limitation and not related to JDO/JPA, so you > won't > >> > be > >> > able to do this in Objectify either (you can look at the low-level > API, > >> > it > >> > doesn't provide this functionality). I believe I saw an issue in the > >> > issues > >> > tracker about creating cursors from arbitrary locations. > >> > > >> > -- > >> > You received this message because you are subscribed to the Google > >> > Groups > >> > "Google App Engine for Java" group. > >> > To post to this group, send email to > >> > [email protected]. > >> > To unsubscribe from this group, send email to > >> > [email protected]<google-appengine-java%[email protected]> > . > >> > For more options, visit this group at > >> > http://groups.google.com/group/google-appengine-java?hl=en. > >> > > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups > >> "Google App Engine for Java" group. > >> To post to this group, send email to > >> [email protected]. > >> To unsubscribe from this group, send email to > >> [email protected]<google-appengine-java%[email protected]> > . > >> For more options, visit this group at > >> http://groups.google.com/group/google-appengine-java?hl=en. > >> > > > > -- > > You received this message because you are subscribed to the Google Groups > > "Google App Engine for Java" group. > > To post to this group, send email to > [email protected]. > > To unsubscribe from this group, send email to > > [email protected]<google-appengine-java%[email protected]> > . > > For more options, visit this group at > > http://groups.google.com/group/google-appengine-java?hl=en. > > > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To post to this group, send email to > [email protected]. > To unsubscribe from this group, send email to > [email protected]<google-appengine-java%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
