【问题标题】:Google App Engine/JPA Can't sort and apply inequality filter with two different util.datesGoogle App Engine/JPA 无法使用两个不同的 util.date 对不等式过滤器进行排序和应用
【发布时间】:2017-02-16 23:07:02
【问题描述】:

在我的应用程序中,我有以下方法。相关部分是查询。

public List<ShiftlistDTO> getShiftlists() {
    //Get from Datastore.
    EntityManager em = EMF.get().createEntityManager();

    List<?> untypedShiftlists = em.createQuery("SELECT sl FROM Shiftlist sl WHERE sl.end > :currentDate ORDER BY sl.start")
            .setParameter("currentDate", new Date()).getResultList(); 
    em.close();

    //Cast to Shiftlist and get DTOs.
    List<ShiftlistDTO> shiftlistDTOs = new ArrayList<>();       
    for (Object shiftlist : untypedShiftlists)
        shiftlistDTOs.add(Shiftlist.class.cast(shiftlist).getData()); // ClassCastException? Shouldn't occur.
    return shiftlistDTOs;
}

执行此查询时,会抛出以下异常。

java.lang.IllegalArgumentException:第一个排序属性必须是 与应用不等式过滤器的属性相同。 在您的查询中,第一个排序属性是 start 但不等式 过滤器已结束

当使用的日期为 sl.startsl.end 时,查询工作正常。

为什么不能对两个不同的日期进行过滤和排序,我应该如何解决这个问题?

我正在努力实现以下目标。 考虑 Shiftlist 表。

一个 Shiftlist 在某个时间开始并在某个时间后结束(名称/日期/shiftTypes 的含义与此问题无关)。

我想查询所有尚未结束的 Shiftlists(即sl.end &gt; new Date())并按开始时间排序。

【问题讨论】:

    标签: java google-app-engine jpa google-cloud-datastore


    【解决方案1】:

    Cloud Datastore 仅允许您执行我们可以通过结果集的大小而不是整体数据集的大小来证明可扩展性的查询。这可确保随着您的应用扩展,对数据库的调用仍会及时返回,而不是突然增长到 30 秒的查询,这与不可用没有太大区别。

    当您对单个属性有顺序和不等式时,Cloud Datastore 可以激光进入索引中的适当位置,并以适当的排序顺序返回索引中指示的实体序列。

    如果我们允许您订购并在不同属性上存在不等式,我们将失去激光输入并仅从索引中读取的能力。相反,Cloud Datastore 需要做一些非常不可扩展的事情,例如将所有结果保存在内存中并在返回之前进行排序,或者扫描整个数据集。这两种方法都不能真正及时大规模地成立,因此是不允许的。

    PS:如果不了解您的用例以及您想要实现的目标,我无法真正回答“如何”。

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 2012-07-07
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多