私のデータベースはMSSQLです。ROW_NUMBER()
HQLで使用したい。出来ますか?どのように?私は知っていCustom Functions
ます。ただし、web.configを変更する必要のない方法をお勧めします。
アップデート:
私の最終的な目標は、HQLを使用した最後のnレコードを除く、テーブル/エンティティ内のすべてのレコードを削除することです。それらすべてをメモリにロードしてから削除するのは好きではありません。
私のデータベースはMSSQLです。ROW_NUMBER()
HQLで使用したい。出来ますか?どのように?私は知っていCustom Functions
ます。ただし、web.configを変更する必要のない方法をお勧めします。
アップデート:
私の最終的な目標は、HQLを使用した最後のnレコードを除く、テーブル/エンティティ内のすべてのレコードを削除することです。それらすべてをメモリにロードしてから削除するのは好きではありません。
NH v2以降、HQLはを介して削除および更新ステートメントをサポートしIQuery.ExecuteUpdate()
ます。IQuery.SetMaxResults()
and IQuery.SetFirstResult()
(を使用)を使用して実験しROW_NUMBER()
、目的の効果を得ることができます。
編集:私は自分自身を実験しました、SetMaxResultsとSetFirstResultはExecuteUpdate()のSQL生成で無視されるので、これは機能しません。
また、以下のコメントでは、HQL ExecuteUpdate(および少なくともDELETEの場合)は、必ずしもオブジェクト状態のメモリ内ロードを意味するわけではありません。
これにはプレーンSQLを使用します。主な理由は、「すべてをメモリにロードするのは好きではない」ということです。これはあまりオブジェクト指向のタスクではないため、ORMは必要ありません。
注:プレーンSQLは、セッションキャッシュが壊れることを意味します。同じ(ステートレスではない)セッション内で他のことを行わない限り、問題は発生しません。もしそうなら、私はOOの方法を選択し、実際にアイテムをメモリにロードします。
ExecuteUpdate
次のように、HQLとDesc
順序を組み合わせて使用します。
delete Person p1
where p1.Id in
(select p2.Id
from Person p2
where rownum <= 10
order by p2.Id desc)