【发布时间】: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.start 或 sl.end 时,查询工作正常。
为什么不能对两个不同的日期进行过滤和排序,我应该如何解决这个问题?
我正在努力实现以下目标。 考虑 Shiftlist 表。
一个 Shiftlist 在某个时间开始并在某个时间后结束(名称/日期/shiftTypes 的含义与此问题无关)。
我想查询所有尚未结束的 Shiftlists(即sl.end > new Date())并按开始时间排序。
【问题讨论】:
标签: java google-app-engine jpa google-cloud-datastore