我如何使用JPA条件API执行以下操作:

select count(distinct column1, column2) from table


使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作?

最佳答案

这是一个较晚的答案:-)尽管我不确定情况是否有所改变。

最近,我遇到了同样的需求,并使用concat解决了这个问题,即通过将列连接为伪列,然后在伪列上countDistinct进行了处理。

但是我不能使用criteriaBuilder.concat,因为它使用||进行串联(即Hibernate had trouble with)生成了JPQL。



幸运的是存在@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,这样就可以避免所有这些混乱情况。

07-24 18:48