2011-03-30 78 views
1

我正在撕掉我的頭髮,可能很簡單, ,但我只是不能正確理解。評論標準API - GroupBy - 沒有生成

我的GroupBy子句沒有被添加到EclipseLink生成的SQL中。

已經嘗試了許多不同的命令和下面的代碼的變體。

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... 

有兩個問題在這裏。首先,group by是不正確的,因爲當選擇完整對象時,無法在單個列上進行分組 - 與標準SQL一樣,所有非聚合的選定列都必須在group by中列出。第二個問題是你根本不需要團隊。參見下面爲您選擇:

既然你在這裏不使用任何聚合函數,你真正想要的很簡單:

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)

Btw。我不知道爲什麼eclipse鏈接只是在這裏忽略你的組,而不是報告錯誤。你正在使用哪個版本?