JPA - 如何在没有关联的情况下左连接两个表

13

我有2个表/实体,并且没有关联。 我可以在JPA中使用交叉连接

FROM A as a, B as b WHERE b.col1=a.col1

如何执行左联接?

我想要A中的所有值,并在可能的情况下用B中的值填充它们,如果没有B,则将其保留为NULL。

无法工作:

FROM A as a LEFT JOIN B as b WHERE b.col1=a.col1

需要路径以进行连接!

无效的路径:'b.col1'


2
本文介绍如何使用最新的Hibernate版本进行操作:https://www.thoughts-on-java.org/how-to-join-unrelated-entities/ - Jens Schauder
5个回答

10

只要实体之间不存在关联,您就无法在JPA中执行此操作。

解决方案:

  1. 使用本地查询。
  2. 在它们之间添加关系(最好是一种间接延迟加载的关系)。所谓“间接”,是指这样的关系: A 知道 PseudoEntity, PseudoEntity 知道 B(但关系的所有者是实体B), B 知道 PseudoEntity。

0
你可以使用JPQL来实现这个功能:
FROM A a LEFT JOIN B b ON b.col1=a.col1

0
关于Dimitri Dewaele的回答,这个查询是一个笛卡尔积连接。笛卡尔积连接或交叉连接返回两个或多个连接表中记录集的笛卡尔积。因此,它等同于一个内连接,其中连接条件始终评估为True或连接条件在语句中不存在。如果您想了解更多信息,请点击下面的链接: Sql Cartesian Joins

0

显然,自Hibernate 5.1以来,您现在可以这样做


3
你能否与我们分享一下 JPA 查询或 JPA API 代码的片段? - Basheer AL-MOMANI

-5

使用以下查询,可以通过JPA实现:

FROM A as a, B as b WHERE b.col1=a.col1 OR b.col1 IS NULL

4
这并不等同于 LEFT JOIN。假设你有 b.col1=3 但没有 a.col1=3,你的查询语句将不会返回这一行,但是使用 LEFT JOIN 则会返回它。 - V G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接