使用聚合函数显示部分JPA查询(sum,groupby)

时间:2015-11-26 14:22:15

标签: jpa criteria-api

我正在尝试使用JPA 2中的安全CriteriaQuery执行SQL查询,我想使用数据表在JSF页面中显示结果。 对于视图层,我使用PrimeFaces,JPA实现是EclipseLink。

我想显示一个查询,例如:

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 ();
    }

我收到一些错误,因为使用函数sum,一个新的列不对应VentaLinea类的任何字段所以我明白这个方法不应该返回List,我想这将是一个简单的方法来做到这一点,因为我正在尝试做的事情并不是什么大问题,一个可能的解决方案是使用类来“封装”查询的结果并返回那种类型的列表,但我认为创建太多了我需要的每个可能的查询的类。 我希望有人可以帮助我,抱歉可能出现语法错误。

1 个答案:

答案 0 :(得分:1)

您希望从查询中获得的不是实体列表,而是元组列表。因此无法使用List<VentaLinea>

JPA提供了两种处理这种情况的标准方法:

  • 返回无类型List<?>List,它将有效地保留VentaLinea实体和sum的结果,可以Object[]Tuple
  • 围绕两个值创建一个包装类,通过构造函数传递给它,然后你可以构建一个查询来返回该类的列表

有关如何在此处实施的详细信息:http://www.objectdb.com/java/jpa/query/jpql/select#Multi_Selection_