JPA 2 Hibernate Group BY和Count *与其他列

时间:2015-11-09 07:03:27

标签: java mysql hibernate jpa hibernate-criteria

我很难找到使用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子句。

1 个答案:

答案 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));
            }