hibernate 如何在jpql中编写带sub-select的左外连接?

x7yiwoj4  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(125)

我正在使用hibernate与Postgres数据库交互。我试图进行的查询选择尚未分配给分支的产品。通过branch_product表,产品和分支之间存在多对多关系。我可以用原生SQL编写查询:

SELECT p.*
FROM product p
LEFT JOIN (
  SELECT bp.product_id
  FROM branch_product bp
  WHERE bp.branch_id = ?
  ) AS sub ON sub.product_id = p.id
WHERE p.tenant_id = ?
  AND sub.product_id IS NULL;

查询的工作方式是通过构建sub表,该表包含分支中所有产品的行。然后,Product中未与sub连接的任何行都是我想要的-尚未添加到分支的产品。
我还没有弄清楚如何使用jpql来表达这个查询。如果我使用本机查询,那么hibernate Entities就不能很容易地加载,因为没有为列设置jsonMap。如果我可以使用jpql来进行这个查询,那将保存很多工作。

eufgjt7s

eufgjt7s1#

所以在Hibernate 6中,当然可以这样写HQL:

select p.id, ph.n 
from Person p 
left join 
    (select phone.number as n, phone.person as pp from Phone phone) as ph 
    on ph.pp=p

我相信这和你的问题很相似
但是我不明白这样做有什么意义。在我看来,你的查询可以很容易地被重写,不使用子查询。
在我的例子中,我会写:

select p.id, ph.number
from Person p 
left join Phone ph on ph.person=p

在你的SQL查询中,我会写:

SELECT p.*
FROM product p
LEFT JOIN branch_product bp
  ON bp.product_id = p.id and bp.branch_id = ?
WHERE p.tenant_id = ?
  AND bp.product_id IS NULL

也许我错过了一些东西,我不明白你的子查询有什么目的。

相关问题