gpt4 book ai didi

java - JPA 加入聚合函数

转载 作者:行者123 更新时间:2023-11-30 21:47:37 27 4
gpt4 key购买 nike

我是 JPA 的初学者,我正在努力为我的数据库结构编写适当的实体类。

首先,这是我的表格:

create table article (
id varchar(100) not null primary key,
title varchar(255) not null
)
create table article_provider (
providerId varchar(60) not null,
articleId varchar(100) null,
isOnSale BOOL NOT NULL,
constraint article_provider_articleid_fk foreign key (articleId) references article (id) on update cascade on delete cascade
)

如您所见,我有一对多关系(每篇文章可以有 0..n 个提供者)。现在,在访问文章时,我还想知道该文章是否由其任何供应商出售。为此,我将使用以下 SQL 查询:

SELECT article.*, MAX(article_provider.isOnSale) AS isOnSale FROM article
LEFT JOIN article_provider ON article.id = article_provider.articleId
GROUP BY article.id

我如何最好地使用 Hibernate/JPA 获取这种类型的结果?

最佳答案

您的查询不正确——您在 SELECT 子句中使用了 GROUP BY 子句中没有的属性,但是例如要选择 Article.id + MAX(无论什么),您可以使用类似的东西:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Article> query = builder.createQuery(Article.class);
Root<Article> root = query.from(Article.class);
Join<Article, ArticleProvider> join = root.join(Article_.provider, JoinType.LEFT);
query.multiselect(root.get(Article_.id), builder.max(sale));
query.groupBy(root.get(Article_.id));
// query will return collection of scalar attributes (ID + Number)
Object result = entityManager.createQuery(query).getResultList()

要准确选择 Article.* + MAX(sales),您需要将上面的内容用作 子查询 ,然后再次加入 Article 实体。

但其他地方也有类似的例子:How do I write a MAX query with a where clause in JPA 2.0?

编辑:

关于java - JPA 加入聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707413/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com