gpt4 book ai didi

hibernate - 单向一对多关系的条件查询

转载 作者:行者123 更新时间:2023-12-04 00:42:43 25 4
gpt4 key购买 nike

所以,我有以下实体:

@Entity
public class Supplier {
@Column(name = "SUPPLIERID")
private BigInteger supplierId;

@OneToMany
@JoinColumn(name = "ID_SUPP", foreignKey = @ForeignKey(name = "fk_POIS_SUPP"))
private List<POS> posList;

...
}

@Entity
public class POS {
@Column(name = "POSID")
private BigInteger posId
}

所以, POS没有对 Supplier 的引用,这意味着我们有一个单向的一对多关系。我需要找一个 POS来自 posIdsupplierId .即,查找指定 supplierId 的供应商然后在供应商的 pos 列表中找到具有指定 posId 的 pos。我如何为此编写条件查询?

我尝试使用子查询。我的想法是创建一个子查询来获取所有 POS的一个 Supplier给定 supplierId .然后主查询将在这些 POS 中搜索用于 POS与给定的 posId .

问题是我无法编写一个查询来获取 Supplier POS的名单s。显然你不能写一个 List<POS> 类型的查询:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<POS> outerQuery = cb.createQuery(POS.class);
Root<POS> outerQueryRoot = outerQuery.from(POS.class);

Subquery<POS> subquery = outerQuery.subquery(POS.class);
Root<Supplier> subqueryRoot = subquery.from(Supplier.class);
subquery.where(cb.equal(subqueryRoot.get(Supplier_.supplierId), supplierId));
subquery.select(subqueryRoot.get(Supplier_.posList);

在最后一行,我收到一个编译错误 Expression<POS> does not match Expression<List<POS>> .而且我无法更改子查询的类型,因为 Java 不允许通用类文字( List<POS>.class )。

有任何想法吗?

最佳答案

我找到了没有子查询的非常简单的解决方案。从Suppler开始,通过posList加入POS,然后'select'POS。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<POS> query = cb.createQuery(POS.class);

Root<Supplier> supplierRoot = query.from(Supplier.class);
ListJoin<Supplier, POS> posList = supplierRoot.joinList(Supplier_.posList);
query
.select(posList)
.where(
cb.equal(supplierRoot.get(Supplier_.suppliertId), supplierId),
cb.equal(posList.get(POS_.posId), posId)
);

使用 Hibernate 5.2.11,它通过 N->M 表生成了两个内部连接的很好的查询,非常类似于手动编写的代码;-)。
接受的答案是我猜错了,因为它跳过了“posList”关系。它将选择与指定供应商无关的 POS 对象。

关于hibernate - 单向一对多关系的条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27939173/

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