2009-09-11 23 views
6

में क्वेरी का उपयोग इकाई पर विचार तालिकामानचित्र हाइबरनेट

sales (id, seller_id, amount, date) 

और यहाँ एक राय यह है कि sales से क्वेरी SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

total_sales (seller_id, amount) 

का उपयोग कर उत्पन्न किया जाता है मैं कुल बिक्री के लिए लेकिन बिना एक इकाई बनाना चाहते एसक्यूएल पक्ष पर देखें।

यह इकाई एक प्रश्न से निर्मित की जाएगी। मुझे मिली सबसे नज़दीकी चीज़ this है, लेकिन मैं इसे काम नहीं कर सका।

भले ही मैं लोडर को परिभाषित करता हूं, हाइबरनेट इकाई की तालिका को देखता है और अगर उसे यह नहीं मिल पाता है तो त्रुटि मिलती है। यदि मैं तालिका बनाता हूं तो यह परिभाषित क्वेरी से इकाई को लोड नहीं करता है, हाइबरनेट क्वेरी को स्वयं उत्पन्न करता है।

क्या @Loader को काम करने का कोई तरीका है या क्या कोई अन्य तरीका है कि मैं इकाई को एक क्वेरी मैप कर सकता हूं?

+1

आप नहीं बनाने के लिए 'session.createCriteria (TotalSales.class)' कस्टम लोडर के माध्यम से काम कर सकेंगे। डेटाबेस में बैकिंग ऑब्जेक्ट (टेबल या व्यू) के बिना आप इसे (और न ही आपको) इकाई के रूप में मैप कर सकते हैं। अच्छे पहले जवाब के लिए – ChssPly76

उत्तर

18

आप क्वेरी में new का उपयोग क्यों नहीं करते?

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

आप विक्रेता_आईडी और एक पूर्णांक लेने वाले कन्स्ट्रक्टर के साथ केवल क्लास टोटलसेल्स लिखते हैं।


संपादित: मापदंड API का उपयोग करते हैं, तो आप उपयोग कर सकते हैं AliasToBeanResultTransformer (API docs देखें)। यह प्रत्येक उपनाम नाम को उसी नाम की संपत्ति पर प्रतिलिपि बनाता है।

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 संपत्ति की जरूरत है।

+0

+1। – KLE

+0

क्योंकि मैं की तरह 'session.createCriteria (TotalSale.class) .list नई इकाई का उपयोग करना चाहते()' – nimcap

+0

जोड़ें मापदंड के लिए मेरे जवाब देने के लिए एक अनुभाग जोड़ा गया। –

0

स्टीफन के जवाब के अलावा, आप भी एक स्पष्ट HQL क्वेरी

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

परिणाम स्वाभाविक रूप से सूची में संग्रहीत किया जाता करने के लिए इस्तेमाल कर सकते हैं। इस डेटाप्रकार आपके लिए सुविधाजनक नहीं है, तो आप:

  • (स्टीफन के जवाब का उपयोग बेहतर शायद होगा)
  • डाटा स्टोर करने के लिए एक नक्शा बनाने (आप भी इस एम्बेड कर सकते हैं उन लोगों के साथ नया TotalSale वस्तुओं को बनाने के सीधे अनुरोध में)।
0

आप एक अनुकूलित लोडर को परिभाषित करने का प्रयास कर सकते हैं। मैंने कभी इसका उपयोग नहीं किया, लेकिन यह उचित लगता है:

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

वहाँ more details in the manual हैं।

वैकल्पिक रूप से, आप सीधे कोड में से कोई नाम क्वेरी, इस तरह से आप TotalSale की मैपिंग की जरूरत नहीं है और कोड में क्वेरी लिखने की जरूरत नहीं है का उपयोग कर सकते हैं। नामित प्रश्न वस्तुएं भी वापस कर सकते हैं। प्रलेखन में details about named queries देखें।

+0

यह किसी भी तरह से 'session.createCriteria()' के साथ मदद नहीं करेगा। – ChssPly76

+0

मुझे वास्तव में संदेह है कि इस मामले में बनाने के लिए दृढ़ता से आवश्यकता है, इसलिए मैं वैकल्पिक दृष्टिकोण का प्रस्ताव करता हूं। –

+0

हां, और मैंने आपका अन्य उत्तर अप-वोट किया। – ChssPly76

0

तुम सच में एक विशिष्ट इकाई केवल इस काम के लिए आप इस तरह के अपने आदेश-दर के लिए मानदंड इंजन के लिए नहीं पहुंच, प्रतिबंध आदि जो के रूप में एक कस्टम गुण

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

पर एक 'सूत्र' का उपयोग कर सकते हैं तो मैं सोचें कि आप इसका उपयोग करना चाहते हैं।

+0

यह तब तक काम नहीं करेगा जब तक कि "विक्रेता" तालिका मौजूद न हो और किसी अन्य इकाई से मैप न हो। और अगर वह मामला था, तो पूरा बिंदु मंथन है। – ChssPly76

+0

वास्तव में मेरे पास पोस्ट में गलतियों का एक बकवास है, मैंने पोस्ट करने का एकमात्र कारण शायद विषय-स्टार्टर को एक विचार मिलता है या उसे वास्तव में जो कुछ चाहिए उसे लेकर कुछ जानकारी प्रदान करता है। अन्यथा स्टीफन का जवाब उचित लगता है – Jaguar