JPA NamedQuery 与聚合函数和分组依据一起使用

Posted

技术标签:

【中文标题】JPA NamedQuery 与聚合函数和分组依据一起使用【英文标题】:JPA NamedQuery use with aggregation functions and group by 【发布时间】:2017-07-24 16:28:09 【问题描述】:

我的数据库表 Foo 中有几条记录,我需要聚合一列来汇总其值。

代表表格的实体是这样的:

@Entity
@Table(name = "FOO")
@NamedQueries(
@NamedQuery(name = "Foo.total", query = "SELECT f.id, sum(f.someInt) AS 
SOME_INT, f.parentId FROM Foo f where f.parentId = 'root' group by 
p.parentId"),
@NamedQuery(name = "Foo.findAll", query = "SELECT f from Foo f") )
public class Foo 

@Id
@Column(name = "ID", insertable = false, updatable = false)
private String id;

@Column(name = "PARENT_ID", insertable = false, updatable = false)
private String parentId;

@Column(name = "SOME_INT", insertable = false, updatable = false)
private Integer someInt;

public Foo() 

如果我在我的 dao 服务 bean 上调用它:

entityManager.createNamedQuery("Foo.total", Foo.class).getResultList();

我收到此错误:

Caused by: java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [Foo]

JPA 似乎无法将返回值与对象 Foo 匹配。如果是这样,我怎样才能使它起作用?

如果我将另一个 @NamedQuery 称为“Foo.findAll”,它可以正常工作。

【问题讨论】:

【参考方案1】:
SELECT f.id, sum(f.someInt) AS SOME_INT, f.parentId FROM Foo f 
where f.parentId = 'root' group by p.parentId"

此查询不返回 Foo 实体,而是返回投影。

您可能希望使用您选择的属性创建一个自定义 POJO,并在创建查询时将其用作返回类型。

请参阅 this 和 this link。

【讨论】:

以上是关于JPA NamedQuery 与聚合函数和分组依据一起使用的主要内容,如果未能解决你的问题,请参考以下文章

即使字段包含在分组依据列表中,分组依据或聚合错误

JPA:如何将@NamedStoredProcedureQuery 与@NamedQuery 结合起来执行周边搜索?

SqlServer:分组查询和聚集函数

PySpark 聚合和分组依据

如何在 JPA 中使用 NamedQuery

JPA 计数 NamedQuery