Как использовать ROW_NUMBER () в HQL? - PullRequest
3 голосов
/ 05 апреля 2011

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

ОБНОВЛЕНИЕ:

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

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

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

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

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

0 голосов
/ 06 апреля 2011

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

delete Person p1 
where p1.Id in 
            (select p2.Id 
             from Person p2 
             where rownum <= 10
             order by p2.Id desc)
0 голосов
/ 06 апреля 2011

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

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

...