Вот поздний ответ :-), хотя я не уверен, что все изменилось.
Недавно я столкнулся с той же самой потребностью и обошел ее, используя concat, то есть объединяя столбцы в псевдостолбец , затем countDistinct
в псевдостолбце.
Но я не смог использовать criteriaBuilder.concat
, потому что он генерировал JPQL, используя ||
для конкатенации, что Hibernate имел проблемы с .
К счастью, есть @Formula
, поэтому я сопоставил псевдостолбец с полем с помощью @Formula
:
@Entity
public class MyEntity {
@Column(name="col_a")
private String colA;
@Column(name="col_b")
private String colB;
@Formula("concat(col_a, col_b)") // <= THE TRICK
private String concated;
}
Таким образом, я наконец смогу использовать поле concated
для CriteriaBuilder.countDistinct
:
//...
Expression<?> exp = criteriaBuilder.countDistinct(entity.get("concated"));
criteriaQuery.select(exp);
TypedQuery<Long> query = entityManager.createQuery(criteriaQuery);
return query.getSingleResult();
Я бы хотел, чтобы JPA (или, надеюсь, уже) поддерживал countDistinct
с несколькими столбцами, тогда можно было бы избежать всего этого беспорядка.