我有一个带有 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 然后低效地计算它吗?