У меня есть Быть в спящем режиме вопроса о HQL. Я хотел бы записать подзапрос как полученную таблицу (по причинам производительности). Действительно ли возможно сделать это в HQL? Пример:
FROM Customer WHERE country.id in
(SELECT id FROM (SELECT id FROM Country where type='GREEN') derivedTable)
(btw, это - просто демонстрационный запрос, так не давайте совет относительно перезаписи его, просто полученное понятие таблицы, я интересуюсь),
К сожалению, нет, производные таблицы в настоящее время не работают в HQL. Например, работает следующее:
List<int> result =
nHSession.CreateQuery( @"select distinct Id from User u")
.List<int>().ToList();
... следующее вызывает это исключение: Возникло исключение типа Antlr.Runtime.NoViableAltException. рядом со строкой 1, столбец 24 [выберите отдельный идентификатор из (выберите u из S2.BP.Model.User u)]
List<int> result = nHSession.CreateQuery(
@"select distinct Id from (select u from User u)")
.List<int>().ToList();
В качестве альтернативы можно было бы создать именованный запрос, содержащий необработанный sql, или создать хранимую процедуру и вызвать ее через именованный запрос, например:
List<int> result = nHSession.GetNamedQuery("spUserIds")
.SetInt32("id", 3)
.List<int>().ToList();
Вы можете найти некоторую информацию о производных свойствах и соображениях производительности в моем блоге в http://blog.eyallupu.com/2009/07/hibernate-dehibited-properties.html
Надеюсь, это поможет,
Эял Лупу