спящий режим hql отличается между WITH и WHERE

#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» позволяет получить даже кошек без котят.