我试图订购一个querydsl查询,以便首先订购一个关系为null值的所有实体,但我无法弄清楚如何做。
我希望:
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
的所有书籍,即使它没有,它也会根据名称对它们进行排序,当我只想要它们是否为该值时为它们排序。
Hibernate版本:3.6.6.Final
QueryDSL版本:3.2.3
答案 0 :(得分:2)
您可以使用CaseBuilder:
query.orderBy(new CaseBuilder()
.when(QBook.book.original.isNull())
.then(0)
.otherwise(1)
.asc()
)
答案 1 :(得分:0)
缺乏更好的解决方案,我计划添加一个布尔值,指示original
是否为空。可以按照我想要的方式轻松订购该值。
答案 2 :(得分:0)
对于类似情况,我使用了以下代码行
List<OfRecords> oList
= jpaQuery
.orderBy
(new CaseBuilder()
.when(q.dGroupDate.isNull())
.then(0).otherwise(1)
.asc()
,q.dGroupDate.asc()
)
.list(q);
代替
List<OfRecords> oList
= jpaQuery
.orderBy
(q.dGroupDate.asc()
)
.list(q);
如您所见,我添加了一个FIRST条件来管理NULL值,以便在GROUP-DATE字段中所有包含NULL的记录都首先被执行,并在末尾列出。
第二个Order By
条件仍然可以管理NOT-NULL值。