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

Show partial JPA queries with aggregate functions ( sum, groupby )

我正在尝试使用 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 的任何字段 class 所以我明白这个方法不应该 return 列表,我我猜这将是一种简单的方法,因为我想做的不是什么大事,一个可能的解决方案是使用 classes 来 "encapsulate" 查询的结果和return 那种列表,但我认为没有必要为我需要的每个可能的查询创建一个 class。 我希望有人能帮助我,对于可能的语法错误感到抱歉。

您想从查询中得到的不是实体列表,而是元组列表。结果无法使用List<VentaLinea>

JPA 提供了 2 种标准方法来处理这种情况:

  • return 未键入 List<?>List, which will effectively hold both VentaLinea entity and the result of sum, either as Object[] or as Tuple
  • 围绕两个值创建一个包装器 class,这些值通过构造函数传递给它,然后您可以构建一个查询到 class[=25= 的 return 列表]

有关如何实施的更多详细信息,请点击此处:http://www.objectdb.com/java/jpa/query/jpql/select#Multi_Selection_