使用聚合函数(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_
我正在尝试使用 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 ofsum
, either asObject[]
or as Tuple - 围绕两个值创建一个包装器 class,这些值通过构造函数传递给它,然后您可以构建一个查询到 class[=25= 的 return 列表]
有关如何实施的更多详细信息,请点击此处:http://www.objectdb.com/java/jpa/query/jpql/select#Multi_Selection_