按关系的QueryDSL顺序为null

时间:2015-02-23 20:16:08

标签: java hibernate jpa querydsl

我试图订购一个querydsl查询,以便首先订购一个关系为null值的所有实体,但我无法弄清楚如何做。

我希望:

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

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值。