我整天都在打架,我想不通。我是 JPA 初学者,所以现在 Criteria API 对我来说是一场噩梦。问题:
我有 3 个实体:保单、客户、保险公司。 Policy 引用了客户和保险公司(此处为急切获取)。客户有保单 list ,保险公司也有(此处为延迟获取)。
我正在尝试以下述方式 (SQL) 查找所有策略:
SELECT * FROM POLICY as p WHERE
p.CUSTOMER_ID IN (SELECT ID FROM CUSTOMER as c WHERE [customerPredicates])
AND
p.INSURER_ID IN (SELECT ID FROM INSURER as i WHERE [insurerPredicates])
AND
[policyPredicates]
其中 CUSTOMER_ID/INSURER_ID 是从 Policy 中的@ManyToOne 关系生成的 JoinColumns。
customerPredicates/insurerPredicates/policyPredicates 是谓词列表(根据给定搜索条件准备的“where”条件)。
如何在 Criteria API 中实现这一点?创建此类查询的规则/良好做法是什么?
最佳答案
尝试先重写SQL以使用JOINS
SELECT *
FROM POLICY as p
INNER JOIN CUSTOMER as c ON p.CUSTOMER_ID = c.ID
INNER JOIN INSURER as i ON p.INSURER_ID = i.ID
WHERE [customerPredicates])
AND
[insurerPredicates])
AND
[policyPredicates]
您只需要标准 api 即可获取主要标准(针对保单实体)并为客户实体和保险公司实体创建别名。
Criteria criteria = session.createCriteria(Policy.class, "p");
criteria.setFetchMode("p.Customer", FetchMode.JOIN);
criteria.createAlias("p.Customer", "c");
并将您的限制添加到客户的“c”别名。
保险公司也是如此
关于java - JPA Criteria select 有两个子查询/连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777959/