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()
)
我正在尝试对 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()
)