【问题标题】:QueryDSL order by relation is nullQueryDSL 按关系排序为空
【发布时间】:2015-02-23 20:16:08
【问题描述】:

我正在尝试订购一个 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 的书籍,即使没有,它也会根据名称对它们进行排序,而我只希望它们根据该值是否为空进行排序。

休眠版本:3.6.6.Final

QueryDSL 版本:3.2.3

【问题讨论】:

  • 感谢this bug fix,由于左连接,查询 dsl 3.3.0 或更高版本QBook.book.original.name.asc().nullsFirst() 至少包含空值。
  • 您是否尝试过使用更新版本的 Querydsl?
  • 现在尝试升级 Querydsl 不太现实,但希望我们能够在不久的将来升级它。

标签: java hibernate jpa querydsl


【解决方案1】:

您可以使用 CaseBuilder:

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

【讨论】:

    【解决方案2】:

    由于缺乏更好的解决方案,我计划添加一个布尔值来指示original 是否为空。该值可以很容易地以我想要的方式排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2017-12-10
      • 2019-05-14
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多