0

射影で文字列のコレクションを取得するのに問題があります: 次のクラスがあるとします。

public class WorkSet {
    public Guid Id { get; set; }
    public string Title { get; set; }
    public ISet<string> PartTitles { get; protected set; }
}
public class Work {
    public Guid Id { get; set; }
    public WorkSet WorkSet { get; set; }
    //a bunch of other properties
}

次に、WorkSet.Title、WorkSet.PartTitles、および Id を取得するワーク ID のリストを取得します。

私の考えは、次のようなことをすることでした:

            var works = Session.CreateCriteria<Work>()
            .Add(Restrictions.In("Id", hitIds))
            .CreateAlias("WorkSet", "WorkSet")
            .SetProjection(
            Projections.ProjectionList()
                .Add(Projections.Id())
                .Add(Projections.Property("WorkSet.Title"))
                .Add(Projections.Property("WorkSet.PartTitles")))
            .List();

Id と Title は正常にロードされますが、PartTitles は null を返します。提案してください!

4

1 に答える 1

1

これは、基準を使用すると機能しない場合があります。最も可能性が高いのは、条件によって生成された同じ SQL クエリではセットを取得できないためです。

オブジェクト全体を取得することを実際に検討します。はるかに簡単で、非常に特殊なケースでない場合は、問題を解決する価値はありません。(ちなみに、オブジェクト全体を取得する方が高速である可能性があります。既にキャッシュにある可能性があります。) 通常、重要なのはクエリの数 (そしてもちろんその複雑さ) であり、取得される列の数ではありません。

おそらくHQLで動作し、そこにelements機能があります。とにかく、静的クエリには HQL を使用することを検討してください。より強力です。

select 
  ws.Title, 
  elements(ws.PartTitles), 
  w.id
from 
  Work w 
  inner join w.WorkSet ws
where w.id in (:ids)

elementsselect句で許可されていますが、何が得られるかわかりません。SQL ステートメントが 1 つしか作成されないため、おそらく、結果の PartTitle と同じ数のレコードが得られます。

于 2010-04-12T12:06:16.743 に答える