JPA加入聚合函数

时间:2018-02-09 13:51:13

标签: java mysql hibernate jpa spring-data-jpa

我是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获取此类结果?

1 个答案:

答案 0 :(得分:0)

您的查询不正确 - 您在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(销售),您需要将上述内容用作子查询并再次加入Article实体。

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

编辑: