5

これはほとんど不可能か、非常にトリッキーだと思います。私は CriteriaBuilder、JPA 2.0、Hibernate、および MariaDB を使用しており、CriteriaBuilder で次のクエリを作成したいと考えています。

SELECT COUNT(*) FROM
   (SELECT DISTINCT(SomeColumn) // I think this is not possible?
    FROM MyTable
    WHERE ... COMPLEX CLAUSE ...
    GROUP BY SomeColumn) MyTable

私の質問: 可能ですか? もし、どうやって?

これについてあなたの心を包んでくれてありがとう!

マーク

4

4 に答える 4

5

この例では、メタモデル生成を使用していることを前提としています。

CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Subquery<SomeColumnType> subcq = cq.subquery(SomeColumnType.class);
Root<MyTable> from = subcq.from(MyTable.class);
subcq.select(from.get(MyTable_.someColumn));
subcq.where(** complex where statements **);
subcq.groupBy(from.get(MyTable_.someColumn));
cq.select(cb.count(subcq));
于 2012-06-25T07:00:54.617 に答える
1

同様の問題があり、要素ごとに個別のグループを数え、このスレッドに出くわしました。既存の回答に基づいて、次のように思いつきました

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
Root<Jpa1> countRoot = countQuery.from(Jpa1.class);

Subquery<Long> query = countQuery.subquery(Long.class);
Root<Jpa1> root = query.from(Jpa1.class);

applyFilter(query, root);
query.groupBy(root.get("groupBy_column1"), root.get("groupBy_column2"));
query.select(builder.min(root.get("id_column")));

countQuery.where(builder.in(countRoot.get("id_column")).value(query));
return countQuery.select(builder.count(countRoot.get("id_column")));
于 2021-07-14T08:22:40.810 に答える