【问题标题】:How to Count Distinct on Case Insensitive Column using JPA and Criteria API如何使用 JPA 和 Criteria API 对不区分大小写的列进行计数
【发布时间】:2020-12-14 19:35:04
【问题描述】:

如何使用 JPA 标准 API 执行以下操作?

select count(distinct LOWER(column)) from table

这在没有 LOWER(column) 的情况下工作,但没有产生预期的结果。

但是对于LOWER(column),Hibernate 正在抛出org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '('

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 使用原生查询,JPQL 不支持。
  • @Rono 我可以将本机查询与 Criteria API 一起使用吗,因为我有一些要使用查询构建的可选参数。

标签: spring-boot spring-data-jpa hibernate-criteria criteria-api


【解决方案1】:

试试这样的:

        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<String> cq = cb.createQuery(String.class);
        Root<Table> r = cq.from(Table.class);
        cq.select(cb.lower(r.get(Table_.column))).distinct(true);
        TypedQuery<String> query = em.createQuery(cq);
        
        Long counter = query.getResultList().size();

【讨论】:

    【解决方案2】:

    我建议使用以下原始查询:

    SELECT COUNT(DISTINCT col_lower) AS cnt
    FROM
    (
        SELECT LOWER(column) AS col_lower
        FROM yourTable
    ) t;
    

    然后我尝试想办法使用 JPQL 来表达这一点,但 JPQL 仅支持 WHEREHAVING 子句中的子查询。因此,您可能需要在此处使用原始查询或 Criteria API。

    【讨论】:

      猜你喜欢
      • 2018-02-26
      • 2013-06-21
      • 1970-01-01
      • 2017-09-29
      • 2021-12-18
      • 2011-07-17
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多