2012-07-24 13 views
39

मैं अपने कोड में मानदंड क्वेरी का उपयोग कर रहा हूं। यह हमेशा select * from ...विशिष्ट कॉलम प्राप्त करने के लिए हाइबरनेट मानदंड क्वेरी

इसके बजाय मैं अपनी क्वेरी से एक कॉलम (फ़ील्ड) को उपेक्षा करना चाहता हूं क्योंकि उस क्षेत्र में बाइट्स में बड़ी संख्या में डेटा संग्रहीत है। और यह प्रदर्शन मुद्दा पैदा कर रहा है।

क्या कोई इसके लिए कोई विचार दे सकता है?


कुछ अद्यतन

मैं अपने प्रश्न में एक प्रक्षेपण को जोड़ कर उसे एक प्रश्न की तरह बनाया ...

select 
    this_.TEMPLATE_ID as y0_, 
    this_.TEMPLATE_NAME as y1_, 
    this_.CREATE_DATE as y2_, 
    this_.UPDATE_DATE as y3_, 
    this_.STATUS_CODE as y4_, 
    this_.USER_ID as y5_, 
    this_.UPDATED_BY as y6_, 
    this_.CATEGORY_ID as y7_, 
    this_.PRACTICE_ID as y8_ 
from 
    templates this_ 
inner join 
    user user1_ 
     on this_.USER_ID=user1_.USER_ID 
inner join 
    template_categories category2_ 
     on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where 
    y4_=? 
    and y8_=? 
    and y5_ in (
     ?, ? 
    ) 
order by 
    y1_ asc limit ? 

और अब इस मुद्दे की तरह है .. Unknown column 'y4_' in 'where clause' और एक ही त्रुटि y8_ के लिए, y5_ का मतलब उन सभी के लिए है जहां यह एक त्रुटि देता है।

मैं संशोधित ऐसा क्वेरी ...

select 
    this_.TEMPLATE_ID as y0_, 
    this_.TEMPLATE_NAME as y1_, 
    this_.CREATE_DATE as y2_, 
    this_.UPDATE_DATE as y3_, 
    this_.STATUS_CODE as y4_, 
    this_.USER_ID as y5_, 
    this_.UPDATED_BY as y6_, 
    this_.CATEGORY_ID as y7_, 
    this_.PRACTICE_ID as y8_ 
from 
    templates this_ 
inner join 
    user user1_ 
     on this_.USER_ID=user1_.USER_ID 
inner join 
    template_categories category2_ 
     on this_.CATEGORY_ID=category2_.CATEGORY_ID 
where 
    this_.STATUS_CODE=1 
    and this_.PRACTICE_ID=1 
    and this_.USER_ID in (
     1, 2 
    ) 
order by 
    y1_ asc limit ? 

और यह काम किया। लेकिन मुझे नहीं पता कि एचक्यूएल में इसे कैसे संशोधित किया जाए?

उत्तर

81

उपयोग Projections साथ निर्दिष्ट करने के लिए जो कॉलम आप वापस जाने के लिए चाहते हैं (आप चयन में डाल) या की सूची के साथ नामित क्वेरी बना सकते हैं।

उदाहरण

एसक्यूएल क्वेरी

SELECT user.id, user.name FROM user; 

हाइबरनेट वैकल्पिक

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("id"), "id") 
     .add(Projections.property("Name"), "Name")) 
    .setResultTransformer(Transformers.aliasToBean(User.class)); 

    List<User> list = cr.list(); 
+0

क्या जेपीए के साथ ऐसा करना संभव है? – cingulata

+0

@cingulata हाँ यह संभव है। इस आलेख को देखें http://www.objectdb.com/java/jpa/query/jpql/select –

0

आप इस वर्ग के आधार पर एक और इकाई को मानचित्र कर सकते हैं (आपको दो को अलग करने के लिए इकाई-नाम का उपयोग करना चाहिए) और दूसरा एक प्रकार का डीटीओ (dto has design issues को न भूलें)। आपको दूसरे को केवल पढ़ने के रूप में परिभाषित करना चाहिए और यह स्पष्ट करने के लिए एक अच्छा नाम देना चाहिए कि यह एक नियमित इकाई नहीं है। रास्ते से केवल कुछ कॉलम का चयन प्रक्षेपण कहा जाता है, इसलिए इसके साथ Google आसान होगा।

विकल्प - आप क्षेत्रों कि आप की आवश्यकता उपयोग मापदंड प्रक्षेपण

+0

http://www.mkyong.com/hibernate/hibernate-named-query- उदाहरण/ –