Как использовать ROW_NUMBER () в HQL?

Моя база данных - MS SQL. Я хочу использовать ROW_NUMBER() в HQL. Является ли это возможным? Как? Я знаю о _ 2_. Но предпочитайте способ, при котором не нужно изменять web.config.

ОБНОВЛЕНИЕ:

Моя конечная цель - удалить все записи в таблице / объекте, кроме последних n записей с HQL. Я не люблю загружать их все в память, а затем удалять.


person Afshar Mohebi    schedule 05.04.2011    source источник
comment
Что ты планируешь делать? Всегда есть stackoverflow.com/questions/1998560/, но нам нужно знать ваши потребности.   -  person rebelliard    schedule 05.04.2011
comment
@binaryhowl: пожалуйста, посмотрите мое обновление.   -  person Afshar Mohebi    schedule 06.04.2011
comment
Звучит как странная цель - это разовый шанс? Действительно ли нужен HQL или вы можете просто использовать простой SQL (используя Session.CreateSqlQuery)?   -  person cbp    schedule 06.04.2011


Ответы (3)


Я бы использовал для этого простой SQL. В основном из-за того, что «не люблю загружать их все в память». Это не очень объектно-ориентированная задача, поэтому вам не нужна ORM.

Примечание: простой SQL означает, что кеш сеанса сломан. У вас не возникнет никаких проблем, пока вы не будете выполнять другие действия в рамках одного сеанса (без сохранения состояния). Если вы это сделаете, я бы выбрал объектно-ориентированный способ и фактически загрузил элементы в память.

person Stefan Steinegger    schedule 06.04.2011

начиная с NH v2 HQL поддерживает операторы удаления и обновления через IQuery.ExecuteUpdate(). Вы можете поэкспериментировать, используя также IQuery.SetMaxResults() и IQuery.SetFirstResult() (которые используют ROW_NUMBER()), чтобы получить желаемый эффект.

РЕДАКТИРОВАТЬ: я экспериментировал сам, SetMaxResults и SetFirstResult игнорируются при генерации sql для ExecuteUpdate (), поэтому это не сработает.

Также @ комментарий ниже, HQL ExecuteUpdate (и, по крайней мере, для DELETE) не обязательно означает загрузку состояния объекта в память.

person Jaguar    schedule 06.04.2011
comment
Для этого потребуется загрузить объекты в память. - person Stefan Steinegger; 06.04.2011
comment
Ты неправ! Hql переводится в sql и выполняется напрямую в db! - person Jaguar; 06.04.2011
comment
Да, это правда, но, насколько мне известно, у вас нет доступных SetMaxResults. Чтобы использовать SetMaxResults, вам необходимо сохранить их в памяти. Это то, что я имел в виду, извините, если я не понял. - person Stefan Steinegger; 07.04.2011

Я бы использовал комбинацию порядка ExecuteUpdate и Desc HQL, например:

delete Person p1 
where p1.Id in 
            (select p2.Id 
             from Person p2 
             where rownum <= 10
             order by p2.Id desc)
person rebelliard    schedule 06.04.2011
comment
rownum у меня не сработало. Кстати, я использовал SQL и ROW_NUMBER(). Спасибо. - person Afshar Mohebi; 06.04.2011