【问题标题】:Why JPA query left join on codition not working?为什么 JPA 查询在条件不工作的情况下离开连接?
【发布时间】:2021-08-30 14:41:10
【问题描述】:

我使用 Hibernate 作为 JPA 实现并且有两个表:UserAgency

每个Agency 可以有多个用户。 User 可以有 1 个或 0 个 Agency

User

public class User {
  @Id
  private String userId;

  @ManyToOne
  @JoinColumn(nullable=true)
  @NotFound(action=NotFoundAction.IGNORE)
  private Agency agency;
}

Agency

public class Agency {
  @Id
  private String agencyCd;

  private String delFlg; //0 means in use

  @OneToMany(mappedBy="agency")       
  private List<User> userList;
}

在存储库中,查询是

@Query("SELECT DISTINCT u FROM User u LEFT JOIN u.agency a on a.delFlg='0')

我的问题是,左加入 codition(a.delFlg='0') 不起作用。

delFlg 为 1 的机构都包含在结果中。

如何找到 delFlg 为 0 的左联代理用户?

【问题讨论】:

  • 可能是@Query("SELECT DISTINCT u FROM User u LEFT JOIN Agency a on a.delFlg='0'")@Query("SELECT DISTINCT u FROM User u Where u.agency.delFlg='0'")
  • 这是因为您使用的是left join 而不是inner join。左连接将过滤结果,但不会影响输出行 User。为了确保你得到UserdelFlg = 0,你需要使用inner join

标签: jpa spring-data-jpa left-join jpql


【解决方案1】:

JPA 规范 4.2 第 4.4.5.2 节似乎明确描述了您的情况

没有指定连接条件的外连接在与 join_association_path_expression 对应的外键关系上具有隐式连接条件。它通常会映射到外键关系上带有 ON 条件的 SQL 外连接,如下面的查询所示: Java 持久性查询语言:

SELECT s.name, COUNT(p)
FROM Suppliers s LEFT JOIN s.products p GROUP BY s.name

SQL:

SELECT s.name, COUNT(p.id)
FROM Suppliers s LEFT JOIN Products p
ON s.id = p.supplierId GROUP By s.name

具有显式 ON 条件的外连接会导致将额外的指定连接条件添加到生成的 SQL 中: Java 持久性查询语言:

SELECT s.name, COUNT(p)
FROM Suppliers s LEFT JOIN s.products p
ON p.status = 'inStock' GROUP BY s.name

SQL:

SELECT s.name, COUNT(p.id)
FROM Suppliers s LEFT JOIN Products p
ON s.id = p.supplierId AND p.status = 'inStock' GROUP BY s.name

请注意,此查询的结果将与以下查询的结果不同: 选择 s.name, COUNT(p) FROM Suppliers s LEFT JOIN s.products p WHERE p.status = 'inStock' GROUP BY s.name 后一个查询的结果将排除没有库存产品的供应商,而前一个查询将包括他们。

所以你的查询应该是:

SELECT u 
FROM User u 
LEFT JOIN u.agency a 
WHERE a IS NULL 
OR a.delFlg='0'

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2012-07-06
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多