繁体   English   中英

为什么 JPA 查询 left join on codition 不起作用?

[英]Why JPA query left join on codition not working?

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

每个Agency可以有许多用户。 一个User可以有一个或零个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 的左加入代理机构的用户?

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

没有指定连接条件的外连接在与join_association_path_expression对应的外键关系上具有隐式连接条件。 它通常会映射到 SQL 外连接,外键关系上有一个 ON 条件,如下面的查询所示: 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

请注意,此查询的结果将与以下查询的结果不同: SELECT 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM