2015-11-09 2 views
0

Я застрял в поиске способа выполнения группы BY и Count * с другими столбцами, используя JPA 2 Hibernate EntityManager + CriteriaBuilder apis. Каков наилучший способ сделать это.JPA 2 Hibernate Group BY и Count * с другими столбцами

My SQL запрос будет так же просто, как

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

У меня есть тест Entity создан с точным отображением.

Но, наконец, мне нужен результат с дополнительным полем для подсчета. Я видел пример использования сессий спящего режима и использования прогнозов для них. Но поскольку я использую JPA2 CriteriaBuilder, я не смог его использовать. count with other fields in group by with hibernate

Уверен, что это будет простой и элегантный способ сделать это. Дайте мне знать, если кто-нибудь это знает.

Edit 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 и я, возможно, потребуется динамически вводить где предложения основаны на моих аргументах фильтра.

+0

Первая. Критерии HIbernate и API критериев JPA - это разные вещи: какой из них вы хотите использовать? Во-вторых. Взгляните на достойный учебник по выбранной вами структуре и вернитесь к конкретному вопросу. Мы не собираемся кодировать вас. – 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)); 
      }