3

射影クエリを使用してエンティティを返すことは可能ですか?

SQL クエリ (以下を参照) で正常に実行できましたが、射影クエリで実行する方法が見つかりません。

Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk")

' Convert SQL results into entities {a} and {b}
Dim query As IQuery = session.CreateSQLQuery(sql) _
                                  .AddEntity("a", GetType(a)) _
                                  .AddEntity("b", GetType(b))

Return query.List()
4

1 に答える 1

6

はい、射影クエリからエンティティを返すことができます。

HQL クエリを使用している場合は、HQL select 句で特定のクラスのコンストラクターを指定できます。

IList<Foo> foos = session.CreateQuery(
    "select new Foo(f.Name, f.Value) from Foo f")
    .List<Foo>();

この例では、HQL クエリで使用される署名に適合するコンストラクターが Foo クラスに必要です。すなわち:

AliasToBean ResultTransformer を使用することもできます。これは、クエリから返された値を特定の型のプロパティに自動的にマップします。このアプローチでは、クエリで使用されるエイリアスが、指定された型のプロパティに直接マップされる必要があります。例えば:

IList<Foo> foos = session.CreateQuery(
    "select f.Name as Name, f.Value as Value from Foo f")
    .SetResultTransformer(Transformers.AliasToBean<Foo>())
    .List<Foo>();

これらの例を機能させるには、Foo クラスを次のようにします。

public class Foo
{
    public Foo() { }

    public Foo(string name, double value)
    {
        Name = name;
        Value = value;
    }

    public virtual string Name { get; set; }
    public virtual double Value { get; set; }
}

上記のクラスには、最初の HQL の例の有効なコンストラクターが含まれています。また、2 番目の HQL クエリで使用されるエイリアスと一致するパブリック プロパティも定義します。これにより、AliasToBean トランスフォーマーは、クエリの結果から Foo 型のエンティティを埋めることができます。

ただし、指定した例から、同じ射影クエリから 2 種類のエンティティを返したいようです。これらの方法を使用して達成するのは難しいかもしれません。いくつかの簡単なテストを行いましたが、運がありませんでした。

アップデート:

AliasToBean 結果トランスフォーマーは、Criteria API および HQL で使用できます。トランスフォーマーは同じように使用されますが、射影クエリは Criteria を使用すると少し異なります。基準クエリを使用する例を次に示します。

IList<Foo> foos = session.CreateCriteria<Foo>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Value"), "Value"))
    .SetResultTransformer(Transformers.AliasToBean<Foo>())
    .List<Foo>();
于 2010-01-27T20:41:20.793 に答える