【发布时间】:2020-07-16 03:13:55
【问题描述】:
我有一个使用 SpringBoot 的 Java8 应用程序,它引入了 Hibernate 核心 5.3.10(连接到 PostgreSQL 11)。一个简化的解释:该应用程序正在维护一系列定制的UserData 记录的更改历史记录,其中包含两个LocalDateTime 列用于startDate 和endDate,以及一个userId 列(以及其他列)。
应用程序的语义是UserData 的更改历史记录由start_date 和end_date 维护,不包含重复项(分别),并且endDate 为null 的任何行是 user 的当前 活动 记录。 (因此,用户可能有 no 当前活动 记录。)
检索所有活动行是一件简单的事情,而且效果很好。
但是,我需要为所有用户检索最新行,无论该行是否活动。 p>
使用SQL 实现此结果的一种方法是使用类似以下的查询:
select ud1.* from user_data ud1
where ud1.start_date = (select max(ud2.start_date) from user_data ud2
where ud2.user_id = ud1.user_id);
我一直在尝试编写CriteriaQuery 来复制SQL,但我遇到了CriteriaBuilder.max 方法的数据类型问题。 max 方法抱怨它只接受类型 Number 列。代码如下所示:
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<UserDate> criteriaQuery = builder.createQuery(UserData.class);
final Root<UserData> ud1 = criteriaQuery.from(UserData.class);
final Subquery<LocalDateTime> maxUserDataStartDate = criteriaQuery.subquery(LocalDateTime.class);
final Root<UserData> ud2 = maxUserDataStartDate.from(UserData.class);
maxUserDataStartDate.select(builder.max(ud2.get("startDate"));
// ...
问题出在最后一行,它抱怨ud2.get("startDate") 不是Number 类型的扩展——当然这是真的。
有人知道如何解决这种情况吗?特别是,有没有人可以分享我所追求的示例?
【问题讨论】:
标签: postgresql spring-boot hibernate java-8 localdatetime