在带有 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,空排序似乎完全被忽略)