JPA Criteria API在order by语句中使用ISNULL

时间:2014-03-13 11:22:33

标签: java sql hibernate jpa

我使用MySQL 5.5和Hibernate 3.6和JPA 2.0。我有一个带有firstName的User表,它也可以是null或空字符串。我希望在搜索结果中将这些空的firstName结果放在最后。为此我编写了以下SQL查询,它运行得很好:

SELECT * FROM User ORDER BY ISNULL(firstName), firstName = "", firstName ASC LIMIT 100

现在想要使用条件API将其转换为JPA,我对订单的确不太满意。这就是我所拥有的:

criteriaQuery = criteriaQuery.orderBy(cb.asc(cb.isNull(users.get(User_.firstName))), cb.asc(cb.equal(users.get(User_.firstName), "")), cb.asc(users.get(User_.firstName)));

但是,上面的代码片段不起作用,因为CriteriaBuilder.isNull()方法被转换为IS NULL而不是MySQL的ISNULL()函数。我得到以下异常:

org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: is null 

有关如何使用JPA 2.0

在Order by语句中检查null的任何想法

2 个答案:

答案 0 :(得分:1)

这是不可能的。在JPA中,您只能选择ORDER BY个字段(位于查询的SELECT部分中)。问题是没有IS_NULL函数,可以在SELECT部分使用。

答案 1 :(得分:0)

我遇到了与你完全相同的问题,最后我用这种方式解决了,也许你可以试试:

  CriteriaQuery<> query;
  query.orderBy(cb.desc(cb.selectCase().
when(cb.isNull("field name"),0).otherwise(1)),
cb.asc("field name");