7

エンティティに属性id、username、age、addressがあるとします。今、私はIDとユーザー名が必要で、このコードを使用しています。

射影により、クエリからエンティティのリスト以外のものを返すことができます。

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();

値を取得するにはどうすればよいですか。これらの値はどのオブジェクトで取得されますか。

4

1 に答える 1

27

結果トランスフォーマーが使用されない限り、射影は射影された値を持つ匿名オブジェクトのリストになります。データバインディングにはこれで十分です。

他の用途では、既知のタイプのオブジェクトを作成する結果トランスフォーマーを設定する必要があります。はAliasToBeanTransformer、行ごとに指定されたタイプのオブジェクトを作成し、そのプロパティを行の値に設定します。

結果のタイプがわかっている場合は、ジェネリックList<T>()メソッドを使用できます。

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

結果トランスフォーマーは、SQLおよびHQLクエリでも使用できます。

list2 = Session.CreateSQLQuery("select Id, Username from user_table")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

list2 = Session.CreateQuery("select Id, Username from User")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

これらの例では、Resultクラスはマップされたクラスである必要はなく、選択されたプロパティを持っている必要があります。

partial class Result
{
    public int Id { get; set; }
    public string Username { get; set; }
}
于 2010-02-05T13:35:01.360 に答える