我很难找到使用JPA 2 Hibernate EntityManager + CriteriaBuilder apis与其他列进行Group BY和Count *的方法。做这个的最好方式是什么。
我的SQL查询就像
一样简单select type, count(*) from test group by type
我使用精确映射创建了测试实体。
但最后我需要一个带额外字段的结果。我已经看到了使用hibernate会话并使用相同的投影的示例。但由于我使用JPA2 CriteriaBuilder,我无法使用它。 count with other fields in group by with hibernate
我相信会有一些简单而优雅的方法来做到这一点。如果有人知道,请告诉我。
修改1
截至目前,我可以在不使用条件构建器的情况下进行扩展
List<Object[]> results = em
.createQuery("SELECT m.type AS name, COUNT(m) AS total FROM Test AS m GROUP BY m.type ORDER BY m.type ASC").getResultList();
for (Object[] result : results) {
String name = String.valueOf( result[0]);
int count = ((Number) result[1]).intValue();
logger.info(name + " " + count);
}
但我需要使用CriteriaBuilder做同样的事情,我可能需要根据我的过滤器参数动态注入where子句。
答案 0 :(得分:1)
能够通过这个实现同样的目标
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Test> c = q.from(Test.class);
q.multiselect(c.get("type"), cb.count(c));
q.groupBy(c.get("type"));
TypedQuery<Tuple> t = em.createQuery(q);
List<Tuple> resultList = t.getResultList();
for(Tuple tuple : resultList){
logger.info(tuple.get(0) + " " + tuple.get(1));
}