我是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获取此类结果?
答案 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?
编辑: