Как конвертировать вложенный SQL в HQL - PullRequest
12 голосов
/ 04 марта 2011

Я новичок в Hibernate и HQL.Я хочу написать запрос на обновление на HQL, эквивалент которого SQL выглядит следующим образом:

update patient set 
      `last_name` = "new_last", 
      `first_name` = "new_first" 
where id = (select doctor_id from doctor 
            where clinic_id = 22 and city = 'abc_city');

doctor_id - это PK для doctor и FK и PK в patient.Существует взаимно-однозначное сопоставление.

Соответствующими классами Java являются Patient (с полями lastName, firstName, doctorId) и Doctor (с полями doctorId).

Может кто-нибудь сказать, каким будет HQL-эквивалент приведенного выше SQL-запроса?

Большое спасибо.

Ответы [ 4 ]

13 голосов
/ 04 марта 2011
String update = "update Patient p set p.last_name = :new_last, p.first_name = :new_first where p.id = some (select doctor.id from Doctor doctor where doctor.clinic_id = 22 and city = 'abc_city')";

Вы можете узнать, как сформулировать hql-запросы, если вы проверите спецификацию .Там вы можете найти раздел о подзапросах .

4 голосов
/ 04 марта 2011

Я не думаю, что вам нужен HQL (я знаю, вы спрашиваете об этом явно, но, поскольку вы говорите, что вы новичок в Hibernate, позвольте мне предложить альтернативу в стиле Hibernate). Я не одобряю HQL, потому что вы все еще имеете дело со строками, которые могут стать сложными в обслуживании, как и SQL, и вы теряете безопасность типов.

Вместо этого используйте критерии критериев гибернации и метод s для запроса ваших данных. В зависимости от вашего класса, вы можете сделать что-то вроде этого:

List patients = session.CreateCriteria(typeof(Patient.class))         
    .createAlias("doctor", "dr")
          .add(Restrictions.Eq("dr.clinic_id", 22))
          .add(Restrictions.Eq("dr.city", "abc_city"))
    .list();

// go through the patients and set the properties something like this:
for(Patient p : patients)
{
     p.lastName = "new lastname";
     p.firstName = "new firstname";
}

Некоторые люди утверждают, что использовать CreateCriteria сложно. Правда, к этому нужно немного привыкнуть, но у него есть преимущество безопасности типов, и сложности могут быть легко спрятаны за общими классами. Google для "Hibernate Java GetByProperty", и вы понимаете, что я имею в виду.

2 голосов
/ 04 марта 2011
update Patient set last_name = :new_last , first_name = :new_first where patient.id = some(select doctor_id from Doctor as doctor where clinic_id = 22 and city = abc_city)  
0 голосов
/ 23 марта 2011

Существует значительная разница между выполнением обновления с выбором и фактической загрузкой записей клиенту, их обновлением и отправкой обратно:

UPDATE x SET a=:a WHERE b in (SELECT ...) 

работает в базе данных, данные не передаются клиенту.

list=CreateCriteria().add(Restriction).list();

приносит все записи, которые должны быть обновлены клиенту, обновляет их, а затем отправляет их обратно в базу данных, вероятно, с одним ОБНОВЛЕНИЕМ на запись.

Использование UPDATE намного, намного быстрее , чем использование критериев (подумайте тысячи раз).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...