gpt4 book ai didi

jpa - 使用 JPA Criteria API 的 select 子句中的子查询

转载 作者:行者123 更新时间:2023-12-02 01:53:07 25 4
gpt4 key购买 nike

我正在尝试,如标题所示,在 select 子句中插入一个子查询,就像这个简单的 SQL 一样:

SELECT id, name, (select count(*) from item) from item

这显然只是一个模拟查询,只是为了表达我的观点。 (重点是获取查询返回的每个项目的最后一张发票。)

我已经尝试过这个:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> c = cb.createTupleQuery();
Root<Item> item= c.from(Item.class);

Subquery<Long> scount = c.subquery(Long.class);
Root<Item> sarticolo = scount.from(Item.class);
scount.select(cb.count(sitem));

c.multiselect(item.get("id"),item.get("nome"), scount);

Query q = em.createQuery(c);
q.setMaxResults(100);
List<Tuple> result = q.getResultList();

for(Tuple t: result){
System.out.println(t.get(0) + ", " + t.get(1) + ", " + t.get(2));
}

但我只得到:

java.lang.IllegalStateException: Subquery cannot occur in select clause

如何才能得到类似的结果?

最佳答案

JPA 2.1 和 Hibernate 5.0 支持它。您只需将 getSelection() 添加到主查询的 multiselect 中的子查询参数即可。

c.multiselect(item.get("id"),item.get("nome"), scount.getSelection());

看一下这个工作示例:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<NotificationInfo> cq = builder.createQuery(NotificationInfo.class); //wrapper class
Root<Notification> n = cq.from(Notification.class); //root entity

//Subquery
Subquery<Long> sqSent = cq.subquery(Long.class);
Root<NotificationUser> sqSentNU = sqSent.from(NotificationUser.class);
sqSent.select(builder.count(sqSentNU));
sqSent.where(
builder.equal(sqSentNU.get(NotificationUser_.notification), n), //join subquery with main query
builder.isNotNull(sqSentNU.get(NotificationUser_.sendDate))
);

cq.select(
builder.construct(
NotificationInfo.class,
n.get(Notification_.idNotification),
n.get(Notification_.creationDate),
n.get(Notification_.suspendedDate),
n.get(Notification_.type),
n.get(Notification_.title),
n.get(Notification_.description),
sqSent.getSelection()
)
);
em.createQuery(cq).getResultList();

关于jpa - 使用 JPA Criteria API 的 select 子句中的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662336/

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