2015-11-26 124 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