2015-02-23 75 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() 
)