سؤال

هل من الممكن إعادة كيان باستخدام استعلام إسقاط؟

لقد نجحت في ذلك باستخدام استعلام 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()
هل كانت مفيدة؟

المحلول

نعم ، يمكنك إعادة الكيانات من استفسارات الإسقاط.

إذا كنت تستخدم استعلام HQL ، يمكنك تحديد مُنشئ للفئة المحددة في جملة HQL Select:

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

يتطلب هذا المثال أن يكون لدى فئة FOO مُنشئًا يناسب التوقيع المستخدم في استعلام HQL. بمعنى آخر:

يمكنك أيضًا استخدام ResultTransformer AliastoBean ، والذي يقوم تلقائيًا بتعيين القيم التي تم إرجاعها من الاستعلام إلى خصائص نوع معين. يتطلب هذا النهج أن الأسماء المستعارة المستخدمة في خريطة الاستعلام مباشرة لخصائص النوع المحدد. علي سبيل المثال:

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. كما يحدد الخصائص العامة التي تتماشى مع الأسماء المستعارة المستخدمة في استعلام HQL الثاني ، مما يجعل من الممكن لمحول Aliastobean ملء الكيانات من نوع Foo من نتائج الاستعلام.

ومع ذلك ، من المثال الذي تقدمه ، يبدو كما لو كنت ترغب في إرجاع نوعين من الكيانات من استعلام الإسقاط نفسه. قد يكون من الصعب تحقيق استخدام هذه الطرق. لقد قمت ببعض الاختبارات السريعة ، دون أي حظ.

تحديث:

يمكنك استخدام محول نتائج Aliastobean مع معايير API وكذلك مع HQL. يتم استخدام المحول بنفس الطريقة ، لكن استعلام الإسقاط يبدو مختلفًا بعض الشيء باستخدام المعايير. فيما يلي مثال يستخدم استعلام المعايير:

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>();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top