Frage

Ist es möglich, eine Einheit mit einer Projektions Abfrage zurück?

Ich habe es erfolgreich mit einer SQL-Abfrage durchgeführt (siehe unten), aber nicht finden kann, wie es mit einem Vorsprung Abfrage zu tun.

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()
War es hilfreich?

Lösung

Ja, Sie können Entitäten zurückgeben aus Projektions Abfragen.

Wenn Sie eine HQL-Abfrage verwenden Sie einen Konstruktor für die gegebene Klasse in der HQL select-Klausel angeben:

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

Dieses Beispiel setzt voraus, dass die Foo-Klasse einen Konstruktor hat, der die Signatur in der HQL-Abfrage verwendet passt. Das heißt:

Sie können auch die AliasToBean ResultTransformer verwenden, die automatisch die Werte aus der Abfrage zu den Eigenschaften eines bestimmten Typs zurück abbildet. Dieser Ansatz erfordert, dass die Aliasnamen in der Abfrage Karte direkt an Eigenschaften des angegebenen Typs verwendet. Zum Beispiel:

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

Um diese Beispiele Arbeit zu machen, die Foo-Klasse könnte wie folgt aussehen:

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; }
}

Die Klasse über eine gültige Konstruktor für das erste HQL Beispiel. Es definiert auch öffentliche Eigenschaften dass align mit den Aliasnamen in der zweiten HQL-Abfrage verwendet, die es ermöglichen, die AliasToBean Transformator-Elemente vom Typ Foo aus den Ergebnissen der Abfrage zu füllen macht.

Doch aus dem Beispiel, dass Sie geben, so scheint es, als ob Sie zwei Arten von Einheiten aus der gleichen Projektions Abfrage zurückgeben mögen. Das könnte schwieriger sein, diese Methoden zu erreichen verwenden. Ich habe ein paar schnelle Tests, ohne Erfolg.

Update:

Sie können den AliasToBean Ergebnis Transformator mit der Criteria API verwenden sowie mit HQL. Der Transformator wird auf die gleiche Art und Weise verwendet, aber die Projektion Abfrage sieht ein bisschen anders mit Kriterien. Hier ist ein Beispiel, das eine Kriterien-Abfrage verwendet:

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>();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top