我整天都在战斗,我无法弄明白。我是初学者,所以现在Criteria API对我来说是一场噩梦。问题:
我有3个实体:政策,客户,保险人。政策引用了客户和保险公司(在此急切的获取)。客户有保单列表,保险公司也是如此(懒惰的提取)。
我试图以下面描述的方式找到所有策略(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 是谓词列表('根据给定的搜索条件准备的条件)。
如何在Criteria API中实现这一目标?创建此类查询的规则/良好做法是什么?
答案 0 :(得分:1)
尝试首先重写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是获取主要标准(对于Policy实体)并为Customer实体和Insurer实体创建别名。
Criteria criteria = session.createCriteria(Policy.class, "p");
criteria.setFetchMode("p.Customer", FetchMode.JOIN);
criteria.createAlias("p.Customer", "c");
并将限制添加到" c"客户的别名。
保险公司也是如此