QueryDSL 按关系排序为空

QueryDSL order by relation is null

我正在尝试对 querydsl 查询进行排序,以便首先对具有空值关系的所有实体进行排序,但我不知道该怎么做。

我预计:

query.orderBy(
  QBook.book.original.isNull().asc()
)

要成为我所需要的,其中original是与Book的自指关系。

但这会产生异常:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: is null 
[select book
from com.mydomain.Book book 
order by book.original is null asc]

(真正的例外要长得多,但应该是所有相关信息。)

我也试过了

QBook.book.original.name.asc().nullsFirst()

但这有两个问题。首先,它消除了所有没有 original 的书籍,即使没有,它也会根据名称对它们进行排序,而我只希望它们根据该值是否为 null 进行排序。

休眠版本:3.6.6.Final

QueryDSL 版本:3.2.3

没有更好的解决方案,我打算添加一个布尔值来指示original是否为null。该值可以很容易地按我想要的方式排序。

您可以使用 CaseBuilder:

query.orderBy(new CaseBuilder()
     .when(QBook.book.original.isNull())
     .then(0)
     .otherwise(1)
     .asc()
)