#hibernate #hql
#переход в спящий режим #hql
Вопрос:
Привет, ребята: Я просто изучаю HQL
Кто-нибудь может объяснить или предоставить некоторые ссылки о различиях между WITH и WHERE в HQL?
изhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
пример, подобный:
от Cat как cat слева присоединяйтесь к cat.kittens как kitten с kitten.bodyWeight > 10.0
Могу ли я заменить с на where?
спасибо
Ответ №1:
With
используется для «предоставления дополнительных условий соединения», что означает, что оно добавляется к join, а не к предложению where:
from Cat as cat
left join cat.kittens as kitten
with kitten.bodyWeight > 10.0
будет переведен примерно так;
from Cat as cat
left outer join Cat as kitten
on cat.id = kitten.mother_id
and kitten.bodyWeight > 10.0
в то время как этот
from Cat as cat
left join cat.kittens as kitten
where kitten.bodyWeight > 10.0
преобразуется в
from Cat as cat
left outer join Cat as kitten
on cat.id = kitten.mother_id
where
kitten.bodyWeight > 10.0
Комментарии:
1. Потрясающе, так подробно! позвольте мне попробовать, спасибо
2. В этом примере результат тот же? Я прав? Не могли бы вы, пожалуйста, привести какой-нибудь пример с другим результатом?
3. @user380690: Нет, это приводит не к одному и тому же из-за левого внешнего соединения. Первый запрос возвращает всех кошек в базе данных, и если у них есть котенок с массой тела более 10, он присоединяется к ним, устанавливая столбцы для котенка
null
, если таковых нет (но все равно возвращает кошек). Второй запрос возвращает только кошек, у которых есть котенок с массой тела более 10.
Ответ №2:
Замена «with» на «where» ограничивает результат кошками, у которых есть котята с массой тела > 10,0. Использование «with» позволяет получить даже кошек без котят.