【问题标题】:JPA Criteria API using ISNULL in a order by statementJPA Criteria API 在 order by 语句中使用 ISNULL
【发布时间】:2014-03-13 11:22:33
【问题描述】:

我将 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,但我不太确定 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)));

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

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

关于如何使用 JPA 2.0 在 Order by 语句中检查 null 的任何想法

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

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

    【讨论】:

    • 那么有没有另一种方法可以使用 JPA 标准 API 将 null 和空字符串条目放在结果的底部
    • 我看到了一个解决方案:NativeQueries。
    【解决方案2】:

    我遇到了和你一模一样的问题,最后我用这种方法解决了,也许你可以试试:

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

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 2010-12-19
      • 2016-10-31
      • 2013-11-02
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2014-08-02
      • 2020-02-18
      相关资源
      最近更新 更多