java - JPA Criteria select 有两个子查询/连接

标签 java hibernate jpa h2 criteria-api

我整天都在打架,我想不通。我是 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/

相关文章:

java - jpa,尝试从实体创建表,找不到类 ExpressionVisitor

java - hibernate 插入错误

java - Maven 配置文件在运行 jdk 时激活,而不是在工具链 jdk 上激活

java - 如何避免 IntelliJ 中可嵌入类的验证错误 "Cannot resolve column ' xy'"?

java - 在新版本的 Hibernate View 中打开 session

java - Spring Data JPA 保存方法在 Java 8 功能图中的有效性

java - 如何在Spring Boot中使用JPA的entityManager.getReference?

JavaFX:使节点不占用空间,但让其父级决定其位置

java - 为什么这个程序在 jcreator 上给出运行时错误,但在 netbeans 上却没有?

java - 如何从 web 表访问特定行