【问题标题】:Not Able to retrive all data from datastore无法从数据存储中检索所有数据
【发布时间】:2016-01-02 06:17:16
【问题描述】:

在我的数据存储中有一个表 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();

【问题讨论】:

  • 至少在早期,单个结果集中的服务限制为 1000 个项目,不确定是否还会出现这种情况 - 无论如何都找不到任何指示.. 有您尝试使用光标。另外您是否确认余额(6000 条记录)确实符合查询条件。
  • 确保查询中使用的属性已为所有实体编制索引。

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


【解决方案1】:

首先,您使用的是JPA。来自我们的文档:

警告:我们认为大多数开发人员在使用时会有更好的体验 低级 Datastore API,或开发的开源 API 之一 专门用于 Datastore,例如 Objectify。 JPA 专为 与传统的关系数据库一起使用,因此无法 明确表示 Datastore 的某些方面 不同于关系数据库,例如实体组和 祖先查询。这可能会导致难以解决的微妙问题 理解并修复。

但是,如果您需要继续使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多