问题描述
如何使用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仅支持WHERE
和HAVING
子句中的子查询。因此,您可能需要在此处使用原始查询,也可能需要使用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();