【问题标题】:Using Hibernate to get the latest row with a LocalDateTime使用 Hibernate 获取带有 LocalDateTime 的最新行
【发布时间】:2020-07-16 03:13:55
【问题描述】:

我有一个使用 SpringBoot 的 Java8 应用程序,它引入了 Hibernate 核心 5.3.10(连接到 PostgreSQL 11)。一个简化的解释:该应用程序正在维护一系列定制的UserData 记录的更改历史记录,其中包含两个LocalDateTime 列用于startDateendDate,以及一个userId 列(以及其他列)。

应用程序的语义是UserData 的更改历史记录由start_dateend_date 维护,不包含重复项(分别),并且endDatenull 的任何行是 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


    【解决方案1】:

    您可以通过start_date desc 订购并获得第一名

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<UserData> criteriaQuery = builder.createQuery(UserData.class);
    
    Root<UserData> ud = criteriaQuery.from(UserData.class);
    criteriaQuery.orderBy(builder.desc(ud.get("startDate")));
    entityManager.createQuery(criteriaQuery).getFirstResult();
    

    【讨论】:

    • 这是个好主意,谢谢。我会试一试,看看它对我有什么帮助。
    • 最后,我采用了我最初的提议,并使用@Query 使用 HQL 实现了它,它工作正常,尽管考虑到减少 IDE 重构支持。在 Hibernate ORM 论坛上问了一个类似的问题,没有任何回应(迄今为止)discourse.hibernate.org/t/…
    猜你喜欢
    • 2017-02-20
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多