Google App Engine / JPA无法使用两个不同的util.dates

时间:2017-02-16 23:07:03

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

在我的申请中,我有以下方法。相关部分是查询。

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;
}

执行此Query时,抛出以下异常。

  

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

如果使用的日期是sl.startsl.end,则查询可以正常工作。

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

我试图实现以下目标。 考虑一下Shiftlist表。

enter image description here

Shiftlist在某个时间开始并在一段时间后结束(name / dates / shiftTypes的含义与此问题无关)。

我想查询尚未结束的所有轮班名单(即sl.end > new Date())并按开始时间排序。

1 个答案:

答案 0 :(得分:2)

Cloud Datastore仅允许您执行我们可以根据结果集的大小而不是整体数据集的大小来扩展的查询。这可以确保在您的应用扩展时,对数据库的调用仍会及时返回,而不是突然增长到30秒的查询,这些查询与不可用不同。

当您在单个属性上有订单和不平等时,Cloud Datastore可以激活到索引中的适当位置,并且只需按适当排序的顺序返回索引中指示的实体序列。

如果我们允许您订购并且在不同属性上存在不平等,我们就会失去激光的能力,只能从索引中读取。相反,Cloud Datastore需要做一些非常不可扩展的事情,例如在返回之前将所有结果保存在内存中并进行排序,或扫描整个数据集。这些方法都没有及时实现规模,因此是不允许的。

PS:我无法真正回答“如何”这样做&#39;不了解您的用例以及您想要实现的目标。