JPA 命名查询与 group by 参数名和值

Posted

技术标签:

【中文标题】JPA 命名查询与 group by 参数名和值【英文标题】:JPA named query with group by with paramnames and values 【发布时间】:2017-08-30 17:44:15 【问题描述】:

我是 Hibernate 的新手,我需要使用 Group by 在我的实体上编写一个 JPA 命名查询。

这就是我的实体的样子:

@Entity
@NamedQueries(
@NamedQuery(name="Transaction.getByYear",
        query="from Transaction where year=:year"),
@NamedQuery(name="Transaction.ByTimestamp",
        query="from Transaction where year=:year order by Timestamp desc"),
@NamedQuery(name="Transaction.ByActiveStatusAndTimestamp",
query="from Transaction where year=:year and itemStatus=:itemStatus order by Timestamp desc"),
@NamedQuery(name="Transaction.sumByYear",
        query="SELECT SUM(amount) from Transaction where year=:year")
)
public class Transaction 
@Id
@GeneratedValue
@Column(unique = true)
private int itemId;

@Column
private String itemName;

@Column
private int amount;

@Column
@Enumerated(EnumType.STRING)
private Category itemCategory;

EnumType Categories 有食物、住宿、旅游等多种类型(10 种)

这是我的类别枚举:

public enum Category 


ONBOARDING("Onboarding"),


EDUCATION("Education"),


EQUIPMENT("Equipment"),


SOFTWARE("Software");

private final String category;

    Category(final String category)
    this.category = category;


@Override
public String toString() 
    return category;



我需要有一个查询来计算每个类别的花费总和。

一种方法是在我的事务实体上方有一个命名查询,如下所示:

@NamedQuery(name="Transaction.sumByFood", query="SELECT SUM(amount) from Transaction group by Category.FOOD") 

(我想这就是我们直接在命名查询中给出枚举的方式。如果我错了,请纠正我)

那么我需要针对 10 个类别有 10 个这样的命名查询。

有什么方法可以编写一个命名查询,允许我通过以下方式将参数名称和值发送到组:

@NamedQuery(name="Transaction.sumByFood", query="SELECT SUM(amount) from Transaction group by itemCategory=:itemCategory")

然后传递我想得到的类别总和? 请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

搞定了。首先我们必须提到,我们需要将输出按特定列分组,然后我们需要在 having 子句中给出对该列的约束。这是我写的命名查询:

@NamedQuery(name="Transaction.sumByCategory",
        query="SELECT SUM(amount) from Transaction group by itemCategory having itemCategory=:itemCategory")

P.S:我在后端处理 PostgreSQL,这就是为什么我必须以不同的方式编写它。

【讨论】:

以上是关于JPA 命名查询与 group by 参数名和值的主要内容,如果未能解决你的问题,请参考以下文章

JPA Group by 具有多个字段

如何从 Spring Data JPA GROUP BY 查询中返回自定义对象

计算在JPA中使用“group by”和“have”过滤的行数

使用 TopLink 在 JPA 查询中作为命名参数列出

如何确定通用 PL/SQL 过程的参数(执行 group by 子句)?

如何在 JPA 命名查询的 IN 子句中使用动态参数?