2015-12-08 2 views
1

У меня есть 2 entites, каждый из которых хранится в таблице mysql. 1. productA: {PRODUCTID (рк), убывание, дата} 2. productB: {PRODUCTID (рк), количество, тип, дата}Left Join in HQL - Hibernate query

Я хочу, чтобы запустить этот SQL-запрос:

 select a.* 
    from productA a left join productB b using(productId) 
    where b.productId is null 

(вернуть все изделия из что не существует в б)

можно ли записать этот запрос в Hibernate?

спасибо !!

ответ

1

Можно ли написать этот запрос в Hibernate?

Да, конечно. От JPA specification 2.1 (4.4.5.2 Left Outer Joins):

LEFT JOIN AND LEFT OUTER JOIN являются синонимами. Они позволяют получать набор объектов, в которых совпадающие значения в соединении могут отсутствовать. Синтаксис для левого внешнего соединения является

LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable 
[join_condition] 

Внешнее объединение без указанного условия соединения имеет неявный присоединиться условие над отношение внешнего ключа, соответствующего join_association_path_expression. Это, как правило, будет отображен на SQL внешнего соединения с условием ON на отношение внешнего ключа, как в запросах ниже: Java Persistence языка запросов:

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 

Внешнее соединение с явным условием включения вызовет дополнительное указанное условие соединения, которое будет добавлено к сгенерированному 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 

результат последнего запроса исключает поставщиков, у которых нет produc ts на складе, тогда как первый запрос будет включать их.

Важным вариантом использования LEFT JOIN является возможность предварительной выборки связанных элементов данных в качестве побочного эффекта запроса.Это выполняется , указав LEFT JOIN как FETCH JOIN, как описано ниже.