私があなたの質問を理解しているなら...
nhibernateセットのクエリをなんとかカスタマイズできますか?
...正解です。答えはNOです。
つまり、インスタンスを取得し、そのコレクションClassA
に対してページングとフィルタリングを実行することを考えている場合です。<set>
それは常にメモリ内で行われます。(最後に追加したマッピングでできること)。
アプローチを変えることができます
この場合、フィルターとコレクションアイテムのページングが必要な場合は、逆の方法を強くお勧めします。Criteria
(QueryOver
、HQL
)を作成するのではClassA
なく、上に作成しますClassB
。
まず、ClassB
マッピングを拡張する必要があります。
<class name="ClassB">
<property name="Something" />
<many-to-one name="ClassA" column="FK_ClassB" fetch="join" />
</class>
そして、Criteria
このようなものを作成します
var criteria = NHSession.Current.CreateCriteria<ClassB>();
criteria
.Add(new InExpression("ClassA", new object[] {1})) // id of one or more ClassA
.AddOrder(new Order("Something", true)) // Order By
.SetFirstResult(2) // Skip
.SetMaxResults(10); // Take
var list = criteria.List<ClassB>();
ClassAのマッピングを使用したためfetch="join"
、結果のSQLステートメントはこの質問の最初のスニペットと非常によく似ています。
したがって、このようにして、目的のSQL Selectを実現できますが、ClassA.ClassBCollection
直接使用することはできません。私たちはこのようにそれをしました...
ノート:
マッピングに影響を与えることができるフィルター/ページング<set>
は、where句の静的フィルターと値をフェッチするスタイルです。
Where句はClassBCollection
、のプロパティとしてロードするときに常に評価されますClassA
。それは次のようになる可能性がありますwhere="IsActive=true"
ClassAがClassBCollectionに多くのアイテムを持つことができる場合、それらがどのようにローイングされるかを管理できます。非常に効果的な方法は、属性のバッチサイズがここに文書化されていることです