因此,我有以下实体:
@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,这意味着我们具有单向一对多关系。我需要寻找一个POSby posId和supplierId。也就是说,找到supplierId具有指定posId的供应商,然后在供应商的pos列表中找到一个pos。如何为此编写条件查询?
POS
Supplier
posId
supplierId
我尝试使用子查询。我的想法是创建一个子查询,该子查询将获取具有给定条件POS的a的所有内容。然后,主查询将那些中搜索的一个给定。Supplier``supplierId``POS``POS``posId
Supplier``supplierId``POS``POS``posId
问题是我无法编写查询来获取Suppliers的s列表POS。显然,您不能编写以下类型的查询List<POS>:
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)。
Expression<POS> does not match Expression<List<POS>>
List<POS>.class
有任何想法吗?
我终于找到了答案,只需使用两个roots:
roots
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<POS> cq = cb.createQuery(POS.class); Root<POS> posRoot = cq.from(POS.class); Root<Supplier> supplierRoot = cq.from(Supplier.class); cq.where(cb.and( cb.equal(supplierRoot.get(Supplier_.suppliertId), supplierId), cb.equal(posRoot.get(POS_.posId), posId))); cq.select(posRoot);