左边加入HQL - Hibernate查询

时间:2015-12-08 23:19:09

标签: java sql spring hibernate hql

我有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中编写此查询?

谢谢!

1 个答案:

答案 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,如下所述。