无法从数据存储中检索所有数据

时间:2016-01-02 06:17:17

标签: google-app-engine jpa google-cloud-datastore google-cloud-platform nhibernate-hql

在我的数据库中有一个表EFlow,这个表有7000个条目,但前1000个条目有这些文件:

(ID/Name, appliedBy, approved,  childEflowName, completed,  completedApprovers, created_on, dueDate,    eflowDispName,  eflowName,  isResubmitted,  modified_on,    nextApprover,   parentEflowName,    ruleEmailReceivers, ruleNames,  upComingApprovers,  workFlowName,   workFlowVersion,    approvalStateValues)

剩余的6000个条目都有这些领域:

(ID/Name,   appliedBy,  approvalStateValues,    approved,   childEflowName, completed,  completedApprovers, created_on, draft,  dueDate,    dynamicApprovalStates,  eflowApprovers, eflowDispName,  eflowName,  fieldValues,    isResubmitted,  modified_on,    nextApprover,   parentEflowName,    ruleEmailReceivers, ruleNames,  upComingApprovers,  workFlowName,   workFlowVersion) 

我添加了draft,dynamicApprovalStates,eflowApprovers和fieldValues这个新字段。

我的问题是当我从数据存储区检索数据时,我只获得了前1000条记录。

如何检索所有记录?

我的查询是:

List<EFlow> lst =  this.entityManager.createQuery("select  from " + this.clazz.getName() + " i where  i.completed = false and i.approved = false").getResultList();

1 个答案:

答案 0 :(得分:0)

首先,看起来您正在使用JPA。来自我们的文档:

  

警告:我们认为大多数开发人员都会有更好的使用体验   低级Datastore API,或开发的一个开源API   专门针对数据存储,例如Objectify。 JPA是专为   与传统的关系数据库一起使用,所以没办法   明确表示数据存储的一些方面   与关系数据库不同,例如实体组和   祖先查询。这可能导致难以解决的细微问题   理解并解决。

但是,如果您需要继续使用JPA:

由于结果数量可能很大,您需要处理您的查询分页。

实现此目标的最佳方法是使用cursors

import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.datanucleus.query.JPACursorHelper;

...

Query query = this.entityManager.createQuery("select  from " + this.clazz.getName() + " i where  i.completed = false and i.approved = false")

Cursor cursor = Cursor.newBuilder().build();
do {
   query.setHint(JPACursorHelper.CURSOR_HINT, cursor);

   List<EFlow> lst = query.getResultList();

   // ... Do stuff on lst here .. //

   // Get the cursor so you can see if there are more results
   cursor = JPACursorHelper.getCursor(lst);
} while (cursor != null)