Java 在order by语句中使用ISNULL的JPA标准API

Java 在order by语句中使用ISNULL的JPA标准API,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我在Hibernate3.6和JPA2.0中使用MySQL 5.5。我有一个名为firstName的用户表,它也可以是null或空字符串。我想让这些空名字结果在我的搜索结果中最后一个。为此,我编写了以下SQL查询,效果很好: SELECT * FROM User ORDER BY ISNULL(firstName), firstName = "", firstName ASC LIMIT 100 现在我想使用CriteriaAPI将其转换为JPA,但我不太确定order by。以下是我所拥有的

我在Hibernate3.6和JPA2.0中使用MySQL 5.5。我有一个名为firstName的用户表,它也可以是null或空字符串。我想让这些空名字结果在我的搜索结果中最后一个。为此,我编写了以下SQL查询,效果很好:

SELECT * FROM User ORDER BY ISNULL(firstName), firstName = "", firstName ASC LIMIT 100
现在我想使用CriteriaAPI将其转换为JPA,但我不太确定order by。以下是我所拥有的:

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()方法被转换为isNull,而不是MySQL的isNull()函数。我得到以下例外情况:

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

关于如何使用JPA2.0检查Order by语句中的null的任何想法都是不可能的。在JPA中,您只能选择
orderby
字段(位于查询的
select
部分)。问题是没有is_NULL函数,可以在
选择部分中使用。

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

  CriteriaQuery<> query;
  query.orderBy(cb.desc(cb.selectCase().
when(cb.isNull("field name"),0).otherwise(1)),
cb.asc("field name");
标准查询;
query.orderBy(cb.desc(cb.selectCase())。
当(cb.isNull(“字段名”),0)。否则(1)),
cb.asc(“字段名称”);

那么,是否有另一种方法可以使用JPA标准将null和空字符串条目放在结果的底部呢?请看一个解决方案:NativeQueries。