سؤال

النظر في الجدول

sales (id, seller_id, amount, date)

وهنا وجهة نظر تم إنشاؤها من sales باستخدام الاستعلام SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

total_sales (seller_id, amount)

أريد إنشاء كيان لإجمالي المبيعات ولكن بدون العرض على جانب SQL.

سيتم إنشاء هذا الكيان من خلال استعلام.أقرب ما وجدته هو هذا, ، ولكن لم أتمكن من انجاحه.

حتى لو قمت بتعريف المُحمل، فإن السبات يبحث عن جدول الكيان ويعطي خطأ إذا لم يتمكن من العثور عليه.إذا قمت بإنشاء الجدول، فإنه لا يقوم بتحميل الكيان من الاستعلام المسمى الذي حددته، ويقوم الإسبات بإنشاء الاستعلام نفسه.

هل هناك طريقة لجعل @Loader يعمل أم أن هناك طريقة أخرى يمكنني من خلالها تعيين استعلام للكيان؟

هل كانت مفيدة؟

المحلول

لماذا لا تستخدم فقط new في الاستعلام؟

select new TotalSales(seller_id, count(seller_id))
from sales
group by seller_id

كل ما عليك فعله هو كتابة فصل TotalSales مع مُنشئ يأخذ معرف البائع وعددًا صحيحًا.


يحرر:عند استخدام معايير API، يمكنك استخدام AliasToBeanResultTransformer (يرى مستندات API).يقوم بنسخ كل اسم مستعار إلى خاصية تحمل نفس الاسم.

 List list = s.createCriteria(Sales.class)
  .setProjection(Projections.projectionList()
    .add( Projections.property("id"), "SellerId" )
    .add( Projections.rowCount("id"), "Count" ) )
  .setResultTransformer( 
    new AliasToBeanResultTransformer(TotalSales.class) )
  .list();

ثم الخاص بك TotalSales يحتاج SellerId و Count ملكية.

نصائح أخرى

بالإضافة إلى إجابة ستيفان، يمكنك أيضًا استخدام استعلام HQL صريح

    SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

يتم تخزين النتيجة بشكل طبيعي في القائمة.

  • قم بإنشاء كائنات TotalSale جديدة معهم (ربما يكون استخدام إجابة ستيفان أفضل)
  • أنشئ خريطة لتخزين البيانات (يمكنك أيضًا تضمينها مباشرة في الطلب).

يمكنك محاولة تحديد محمل مخصص.لم أستخدم هذا مطلقًا، لكن يبدو أنه معقول:

<sql-query name="totalSale">
    <return alias="ts" class="TotalSale" />
    SELECT seller_id as {ts.seller_id}, SUM(amount) as ts.amount 
    FROM sales 
    WHERE seller_id = ?
    GROUP BY seller_id
</sql-query>

لست متأكدًا مما إذا كان الفلتر الموجود على معرف البائع مطلوبًا أم لا.

يمكنك الرجوع إلى هذا الاستعلام المسمى في تعيين الفصل:

<class name="TotalSale">
    <id name="seller_id">
        <generator class="increment"/>
    </id>
    <property name="seller_id" />
    <property name="amount" />
    <loader query-ref="totalSale"/>
</class>

هناك مزيد من التفاصيل في الدليل.

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

إذا كنت تريد حقًا كيانًا محددًا لهذه الوظيفة فقط، فيمكنك استخدام "صيغة" على خاصية مخصصة

<class name="SellerSales" table="Sales" lazy="true">
    <id name="SellerId" column="SellerId" type="int">
        <generator class="native" />
    </id>
    <property name="SalesSum" type="float" update="false" insert="false" 
            formula="select SUM(sal.ammount) from sales sal where sal.seller_id = SellerId)" />
</class>

public class SellerSales
{
    public int SellerId {get; set;}
    public float SalesSum {get; set;}
}

على هذا النحو، يمكن الوصول إلى محرك المعايير الخاص بالترتيب حسب والقيود وما إلى ذلك والذي أعتقد أنه السبب وراء رغبتك في استخدامه من أجله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top