1

我有一个带有 Hibernate 的 dropwizard 应用程序,并希望使用 Hibernate 5 的 CriteriaQuery 在 DAO (DataAccessObject) 中实现一个函数。更准确地说,我想查询一个表,其中的对象都配备了一个“id”列和一个“user_id”列(它是一个 PostgreSQL 数据库,表有更多字段,但另一个无关紧要)。

我想计算每个用户在该表中的平均对象数量,因此如果该表称为 table_a,我想使用 Java/Hibernates CriteriaQuery 编写以下查询:

    SELECT avg(counts) FROM
        (SELECT user_id, COUNT(id) as counts FROM table_a GROUP BY user_id) AS foo

我尝试查看此文档文档,但找不到有关执行此类子查询的任何参考。

我的 DAO 方法如下所示:

    public double avgCountPerUser() {
        CriteriaBuilder criteriaBuilder = this.currentSession().getCriteriaBuilder();
        CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createQuery(Tuple.class);
        Root<TableA> tableARoot = criteriaQuery.from(TableA.class);

        criteriaQuery
            .multiselect(tableARoot.get("user_id"),criteriaBuilder.count(tableARoot.get("id")))
            .groupBy(tableARoot.get("user_id"))
            .orderBy(criteriaBuilder.desc(criteriaBuilder.count(tableARoot.get("id"))));
        List<Tuple> tuples= currentSession().createQuery(criteriaQuery).getResultList();
        double result = 0;
        for (Tuple tuple : tuples) {
            result += (Integer) tuple.get(1);
        }
        return tuples.size() == 0 ? 0 : result / tuples.size();
    }

你能帮助我如何正确地做到这一点吗?并且不需要将所有结果拉到 Java-Objects 然后低效地计算它吗?

4

1 回答 1

0

HQL 中的子查询只能出现在 select 或 where 子句中。

https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/queryhql-subqueries.html

如果没有办法创建 hql 查询,那么您应该创建一个本机查询,并尝试不使用某些 dbms 中的特定 sintax 来执行此操作。

于 2017-08-29T11:59:03.867 回答