我使用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的任何想法答案 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");