如何使用JPA和Criteria API对不区分大小写的列进行区分计数

问题描述

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

select count(distinct LOWER(column)) from table

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

但是使用LOWER(column),Hibernate抛出了org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE,found '('

有人可以帮我吗?

解决方法

我建议以下原始查询:

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

然后,我试图考虑一种使用JPQL表示此信息的方法,但是JPQL仅支持WHEREHAVING子句中的子查询。因此,您可能需要在此处使用原始查询,也可能需要使用Criteria API。

,

尝试这样的事情:

        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();