【问题标题】:JPA count(*) using CriteriaBuilder. How to use CriteriaBuilder to retrive the count(*) column使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列
【发布时间】:2019-04-10 17:26:25
【问题描述】:

我有一个关于 CriteriaBuilder API 的问题:

我想计算一列的结果,并返回该计数的结果和该列的不同值的列表。

|      Table_fruit       |     count(Table_fruit)    |
|------------------------|---------------------------|
|          apple         |         (5)               |
|          orange        |         (20)              |
|          banana        |         (400)             |     

所以我想做一个查询来执行这个 SQL 语句:

select distinct COLUMN_NAME_1, count(COLUMN_NAME_1)
from TABLE_NAME
where COLUMN_NAME_2= 'value'
group by COLUMN_NAME_1;
    CriteriaBuilder cb = getCriteriaBuilder();
    CriteriaQuery<Fruit> cq = cb.createQuery(Fruit.class);

    Root<TABLE_NAME> root = cq.from(Fruit.class);

    List<Predicate> predicates = new ArrayList<>();
    predicates.add(cb.equal(root.get("COLUMN_NAME_2"), value));
    cq.where(predicates.toArray(new Predicate[predicates.size()]));

    // how to select the COUNT(*) from the table here? 


    cq.select(root.get("COLUMN_NAME_1")).distinct(true);

    cq.groupBy(root.get("COLUMN_NAME_1"));

所以我的问题是:如何从 Java 中的查询中检索两个值

【问题讨论】:

    标签: java jpa orm criteria criteriaquery


    【解决方案1】:

    试试这个

    cq.multiselect(root.get("COLUMN_NAME_1"), cb.count(root.get("COLUMN_NAME_1"));
    // add your predicates here
    cq.groupBy(root.get("COLUMN_NAME_1"));
    

    【讨论】:

      【解决方案2】:

      1) 将泛型更改为:CriteriaQuery&lt;Object[]&gt; cq = cb.createQuery(Object[]);

      2) 更改选择:cq.select(cb.count(root), root.get("COLUMN_NAME_1"))

      3) 迭代结果列表:

      List<Object[]> results = em.createQuery(cq).getResultList();
      for (Object[] result : results) {
         // actions
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-31
        • 2019-04-09
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        相关资源
        最近更新 更多