JPA Criteria选择两个子查询/连接

时间:2016-01-13 22:03:53

标签: java hibernate jpa h2 criteria-api

我整天都在战斗,我无法弄明白。我是初学者,所以现在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中实现这一目标?创建此类查询的规则/良好做法是什么?

1 个答案:

答案 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"客户的别名。

保险公司也是如此