2015-11-26 54 views
1

我想在JPA 2中使用安全的CriteriaQuery執行一個SQL查詢,並且我想在使用數據表的JSF頁面中顯示結果。 對於視圖層,我使用的是PrimeFaces,而JPA實現是EclipseLink。顯示聚合函數(總和,groupby)的部分JPA查詢

我想顯示的查詢,如:

select ges_venta_lineas.producto_id, sum (ges_venta_lineas.IMPORTETOTAL) from ges_venta_lineas group by ges_venta_lineas.producto_id 

,使用CriteriaQuery中是這樣的。

public List <VentaLinea> getResumen() { 
     CriteriaBuilder em.getCriteriaBuilder qb =(); 
     CriteriaQuery <VentaLinea> c = qb.createQuery (VentaLinea.class); 
     Root <VentaLinea> root = C.From (VentaLinea.class); 

     Expression <BigDecimal> sum = qb.sum (root.get (VentaLinea_.importeTotal)); 
     c.multiselect (root.get (VentaLinea_.producto), sum); 
     c.groupBy (root.get (VentaLinea_.producto)); 
     Query query = getEntityManager() createQuery (c).; 
     query.getResultList return(); 
    } 

我得到了一些錯誤,因爲通過使用功能總和,新的一列,所以我明白,這種方法不應該返回列表不對應於VentaLinea類的任何領域,我想這將是一個簡單的這樣做,因爲我試圖做的並不是什麼大事,一個可能的解決方案是使用類來「封裝」查詢的結果並返回一個這樣的列表,但我想也是這樣爲我需要的每個可能的查詢創建一個類是多餘的。 我希望有人能幫助我,對於可能發生的語法錯誤感到抱歉。

回答

1

你想從你的查詢中得到什麼不是實體列表,而是元組列表。因此無法使用List<VentaLinea>

JPA提供了2點標準的方式來處理這種情況:

  • 返回無類型List<?>List,這將有效地保持兩個VentaLinea實體和sum的結果,無論是作爲Object[]Tuple
  • 創建包裝類,這兩個值通過構造函數傳遞給它,然後您可以構建一個查詢以返回該類的列表

對此處實現它的更多細節:http://www.objectdb.com/java/jpa/query/jpql/select#Multi_Selection_

+0

是我解決它返回Object []對象的列表,Thnk你非常的回答 – Javi2EE

+0

@OnrdejM:是不是有可能以某種方式使用構造方法來寫將彙總值轉換爲原始實體?即對於上面的例子,創建一個'公共VentaLinea(VentaLinea其他,長和)複製構造函數? – Arthur

+1

@Arthur,這種方法是可能的,但很可能不會像你期望的那樣工作。這種方法將創建普通的Java對象,除非您在其上調用em.merge(),否則不會連接到數據庫。創建一個實體類的實例會變得很混亂,這些實例並不是真正的實體。我寧願創建一個單獨的類來使代碼更清晰,以避免將來基於錯誤假設的錯誤。 – OndrejM