2015-02-23 76 views
1

我试图订购querydsl查询,以便所有具有空值关系的实体首先被排序,但我无法弄清楚如何去做。QueryDSL按关系排序为空

我希望:

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

要什么,我需要,其中originalBook一种自我指涉的关系。

但产生的异常:

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

感谢[这个Bug修正(https://github.com/querydsl/querydsl/issues/582)看起来与查询DSL 3.3.0或更高的'QBook.book.original.name.asc()。nullsFirst()'至少会包含空值,这要归功于左连接。 – CorayThan 2015-02-23 23:00:55

+0

你是否试过用更新版本的Querydsl? – 2015-02-25 20:43:02

+0

现在尝试升级Querydsl并不现实,但希望我们能够在不久的将来升级它。 – CorayThan 2015-02-25 21:25:56

回答

0

缺乏一个更好的解决办法,我打算增加一个布尔值,指示original是否为空。这个价值可以通过我想要的方式轻松订购。

0

您可以使用CaseBuilder:

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