2011-03-30 4 views
1

Я отрываю свои волосы от чего-то, что может быть очень простым, , но я просто не могу это исправить.Критерии API - GroupBy - не сгенерировано

Предложение GroupBy не добавляется в SQL, созданный EclipseLink.

Пробовал множество различных заказов и вариантов кода ниже.

public List<Orders> findOrdersEntitiesBySearch(int maxResults, int firstResult, String column1, String column2, String key, boolean searchOrder) { 
    EntityManager em = getEntityManager(); 
    try { 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Orders> cq = cb.createQuery(Orders.class); 
     Root<Orders> order = cq.from(Orders.class); 
     Join<Orders, Products> prod = order.join("productsCollection"); 

     // Where like key 
     if (column1 != null && column2 != null) { 
      if (searchOrder) { 
       cq.where(cb.or(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(order.get(column2).as(String.class)), "%" + key.toLowerCase() + "%"))); 
      } else { 
       cq.where(cb.or(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(prod.get(column2).as(String.class)), "%" + key.toLowerCase() + "%"))); 
      } 
     } else { 
      if (searchOrder) { 
       cq.where(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%")); 
      } else { 
       cq.where(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%")); 
      } 
     } 

     // Order By 
     List<Order> orderByList = new ArrayList<Order>(); 
     orderByList.add(cb.desc(order.get("ordDate"))); 
     orderByList.add(cb.desc(order.get("pkOrdID"))); 
     cq.orderBy(orderByList); 

     // Select 
     cq.select(order); 

     // Group by 
     //cq.groupBy(order.get("pkOrdID")); 
     //Expression<Integer> grouping = order.get("pkOrdID").as(Integer.class); 
     Expression<String> grouping = order.get("pkOrdID").as(String.class); 
     cq.groupBy(grouping); 

     Query q = em.createQuery(cq); 
     q.setMaxResults(maxResults); 
     q.setFirstResult(firstResult); 

     return q.getResultList(); 
    } finally { 
     em.close(); 
    } 
} 

Код компилирует все в порядке, я получаю результаты, но предложение GroupBy не включено.

Как неприятный quickfix, я запускаю список, возвращаемый функцией, чтобы удалить дубликаты, пока не найду решение.

Заранее спасибо за любую помощь,

Дэвид

ответ

0

Для ясности, переписан как обычный запрос JPQL, вы в настоящее время есть что-то вроде этого:

SELECT o 
    FROM Orders o JOIN o.productsCollection p 
    WHERE ... 
    GROUP BY o.pkOrdID... 

Есть две проблемы , Во-первых, группа неверна, потому что вы не можете группировать по одному столбцу при выборе полного объекта - так же, как со стандартным SQL, все выбранные столбцы, которые не являются агрегатами, должны быть перечислены в группе. Вторая проблема заключается в том, что вам вообще не нужна группа. Ниже для ваших вариантов:

Поскольку вы не используете никаких агрегатных функций здесь, что вы на самом деле хотите просто:

SELECT DISTINCT o 
    FROM Orders o JOIN o.productsCollection p 
    WHERE ... 

Поэтому просто уронить группу-по из вашего запроса критериев API и вместо этого используйте cq.distinct(true).

Если вам действительно нужна группа с помощью агрегатных функций для другого запроса, вместо группировки по первичному ключу выбранного объекта, в JPA вы группируете сам объект. Простой пример JPQL может быть:

SELECT o, sum(p.quantity) 
    FROM Orders o JOIN o.productsCollection p 
    WHERE ... 
    GROUP BY o 

В запросе, это будет cq.groupBy(order).

КПП. Я понятия не имею, почему ссылка eclipse просто игнорирует вашу группу, вместо того, чтобы сообщать об ошибке. Какую версию вы используете?

Смежные вопросы