我有2个entites,每个都存储在mysql表中。 1. productA:{productId(pk),desc,date} 2. productB:{productId(pk),数量,类型,日期}
我想运行这个SQL查询:
select a.*
from productA a left join productB b using(productId)
where b.productId is null
(返回b中不存在的所有产品)
是否可以在Hibernate中编写此查询?
谢谢!
答案 0 :(得分:1)
是否可以在Hibernate中编写此查询?
是的,当然。来自JPA specification 2.1 (4.4.5.2 Left Outer Joins):
LEFT JOIN和LEFT OUTER JOIN是同义词。他们启用了 检索在连接中匹配值的一组实体 条件可能不存在。左外连接的语法是
LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable [join_condition]
没有指定连接条件的外连接具有隐式连接 条件超过对应的外键关系 join_association_path_expression。它通常会映射到a 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
后一个查询的结果将排除没有查询的供应商 库存产品,而前一个查询将包括它们。
LEFT JOIN的一个重要用例是启用预取 相关数据项作为查询的副作用。这是完成的 通过将LEFT JOIN指定为FETCH JOIN,如下所述。