NULLS FIRST/LAST 覆盖在 Spring Boot 3/Hibernate 6 的 JPA 存储库中不再起作用

Seb*_*oek 5 java spring hibernate jpa spring-boot

在带有 Hibernate 5 的 Spring Boot 2 中,我们有一个如下查询:

@Query("""
    SELECT m FROM ProjectMember m
    ORDER BY m.lastActive ASC NULLS LAST
    """)
List<ProjectMember> sortLastActiveDesc();
Run Code Online (Sandbox Code Playgroud)

(在类中定义public interface ProjectMemberRepository extends JpaRepository<ProjectMember, UUID> {

该查询与真实查询相比略有删减,只是为了得到一个小的复制案例。

这是必需的,因为我们需要重写空值的排序方式。这里的底层数据库是PostgreSQL。

然而,在带有 Hibernate 6 的 Spring Boot 3.1.0 中,这不再起作用。应用程序将启动并且在启动时不会抛出异常,但是在执行此查询时它将抛出此异常:

org.springframework.dao.InvalidDataAccessApiUsageException
...
... (huge stack trace here)
...
Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: Line 2:26 mismatched input 'NULLS' expecting {<EOF>, ',', EXCEPT, FETCH, INTERSECT, LIMIT, OFFSET, UNION}; Bad JPQL grammar [select m from ProjectMember m
ORDER BY m.lastActive ASC NULLS FIRST
]
    at org.springframework.data.jpa.repository.query.BadJpqlGrammarErrorListener.syntaxError(BadJpqlGrammarErrorListener.java:39)
    at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)

Run Code Online (Sandbox Code Playgroud)

从现在开始,这应该如何工作,而不必回退到本机 SQL?

(注意,我还尝试使用设置空处理属性sort = Sort.by(new Sort.Order(Direction.ASC, "lastActive", NullHandling.NULLS_FIRST));,然后将 Pageable 传递给存储库方法,然后不自己定义排序,但查看生成的 SQL,空排序似乎完全被忽略)

Seb*_*oek 0

正如对我的问题的评论,这只是 Spring Boot 3.1.1 中修复的一个错误:https://github.com/spring-projects/spring-data-jpa/issues/2962