2015-11-09 150 views
0

我一直在尋找一種方法來使用JPA 2 Hibernate EntityManager + CriteriaBuilder API來執行Group BY和Count *。做這個的最好方式是什麼。JPA 2 Hibernate Group BY和Count *與其他列

我的SQL查詢會這麼簡單

select type, count(*) from test group by type 

我有測試實體精確映射創建。

但最後我需要一個額外的字段計數的結果。我見過使用休眠會話和使用相同預測的例子。但是因爲我使用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子句基於我的過濾器參數。

+0

首先要實現相同的。 HIbernate Criteria和JPA Criteria API是不同的東西:你想使用哪一個?第二。看看你選擇的框架體面的教程,並回到一個具體的問題。我們不會爲你編碼。 – perissf

+0

我正在使用JPA CriteriaBuilder – Ysak

+0

那麼,爲什麼你鏈接了一個使用Hibernate標準的答案呢? – perissf

回答

0

能夠通過這個

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