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

2024-02-12

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

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

(在类中定义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)

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

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐