2011-09-21 14 views
36

मैं हाइबरनेट के अनुमान और मानदंड के बारे में थोड़ा उलझन में हूं। अनुमानों का उपयोग कब करें और मानदंडों का उपयोग कब करें?हाइबरनेट अनुमानों का उपयोग कब करें?

कृपया मेरी मदद करें। धन्यवाद!

उत्तर

74

वे परस्पर अनन्य नहीं हैं, आप एक ही समय में दोनों का उपयोग कर सकते हैं। अनुमान आमतौर पर कुछ मानदंडों के संदर्भ में उपयोग किए जाते हैं।

इसे सरल रखने के लिए, हाइबरनेट अनुमानों का उपयोग किसी इकाई या गुणों के समूह के केवल एक सबसेट को क्वेरी करने के लिए किया जाता है, जिसे आप मानदंड से पूछ रहे हैं। आप distinct क्लॉज और max, sum जैसे कुल कार्यों को निर्दिष्ट करने के लिए अनुमानों का भी उपयोग कर सकते हैं। यह का संदर्भ देने जैसा है जो डेटा जो आप ला रहे हैं। SQL क्वेरी में select खंड को संशोधित करने की तरह।

हाइबरनेट मानदंड का उपयोग चयनित होने के लिए डेटा को संतुष्ट करने के लिए परिस्थितियों को परिभाषित करने के लिए किया जाता है। यह का संदर्भ देने जैसा है कि वह डेटा है जिसे आप ला रहे हैं। एक SQL क्वेरी के from और where खंडों को संशोधित करने की तरह।

ध्यान दें कि यह कैसे और जो सख्ती से सच नहीं है, यह सिर्फ एक उन्मुखीकरण ओपी सहायता करने के लिए उद्देश्य से है। आप उदाहरण के लिए के साथ बदल सकते हैं जो डेटा जो आप createCriteria(String associationPath) के साथ ला रहे हैं।

मैं इस लेख Hibernate: Criteria Queries in Depth

+2

और यह) गिनती करने के लिए उपयोगी है (जैसा है -> वापसी (संख्या) session.createCriteria ("बुक") setProjection (Projections.rowCount()) uniqueResult()।। –

1

प्रक्षेपण एक इंटरफेस "org.hibernate.criterion" पैकेज में दी गई है पर एक नज़र लेने के लिए सुझाव देंगे, अनुमान एक वर्ग में एक ही पैकेज में दी गई है, वास्तव में प्रक्षेपण एक इंटरफेस है, और अनुमान एक वर्ग है और प्रक्षेपण वस्तुओं के उत्पादन के लिए एक कारखाना है।

अनुमान अनुभाग में, हमारे पास सभी स्थैतिक विधियां हैं और इस वर्ग की प्रत्येक विधि प्रोजेक्शन इंटरफ़ेस ऑब्जेक्ट लौटाती है।

हम मानदंड के लिए एक प्रोजेक्शन वस्तु जोड़ना चाहते हैं तो हम, एक विधि setProjection()

याद रखें कॉल करने की आवश्यकता मानदंडों के प्रक्षेपण वस्तु को जोड़ते समय है, यह एक समय में एक वस्तु को जोड़ने के लिए संभव है।इसका मतलब है कि अगर हम दूसरे प्रक्षेपण ऑब्जेक्ट को जोड़ते हैं तो यह दूसरा व्यक्ति पहले व्यक्ति को ओवरराइड करेगा (पहला वाला काम नहीं करेगा), इसलिए एक समय में हम मानदंड ऑब्जेक्ट

मानदंडों का उपयोग करके, केवल लोड करने के लिए मानदंडों का उपयोग करके केवल एक प्रोजेक्शन ऑब्जेक्ट कर सकते हैं डेटाबेस से आंशिक वस्तु है, तो हम संपत्ति के लिए एक प्रक्षेपण वस्तु है कि डेटाबेस

Criteria crit = session.createCriteria(Products.class); 
crit.setProjection(Projections.proparty("proName")); 
List l=crit.list(); 
Iterator it=l.iterator(); 
while(it.hasNext()) 
{ 
    String s = (String)it.next(); 
    // ---- print ----- 
} 

से लोड किया जाना हम मापदंड तो जोड़ा पिछले प्रक्षेपण को देखने निष्पादित करने के लिए विचार किया जाएगा करने के लिए कई अनुमानों जोड़ते हैं बनाने की जरूरत ...

Criteria crit = session.createCriteria(Products.class); 

Projection p1 = Projection.property("proName"); 
Projection p2 = Projection.property("price"); 

crit.setProjection(p1): 
crit.setProjection(p2): 
List l=crit.list(); 
+1

यह सवाल का उत्तर कैसे देता है? – 000

+1

मूल से लिंक http://www.java4s.com/hibernate/working-with-hibernate-projections-in-criteria/ –

0
public static void main(String[] args) { 
    SessionFactory factory = new Configuration().configure().addAnnotatedClass(Student.class).buildSessionFactory(); 
    Session session = factory.getCurrentSession(); 
    try { 
     session.beginTransaction(); 
     Criteria c = session.createCriteria(Student.class); 
     Projection p = Projections.property("lastName"); 
     List<String> students = c.setProjection(p).list(); 
     for(String s:students) 
      System.out.println(s); 
     session.getTransaction().commit(); 
     session.close(); 
    } finally { 
     factory.close(); 
    } 
} 

ऊपर में - 210 अनुमान सकल संचालन निष्पादित करने के लिए और एकल स्तंभ क्वेरी प्राप्त करने के लिए, प्रतिबंध के साथ हम एक पंक्ति उपयोग कर सकते हैं, लेकिन अनुमान के साथ हम पूरे स्तंभ

पूर्व उपयोग कर सकते हैं उपयोग किया जाता है उदाहरण के लिए मैंने मानदंडों के लिए एक प्रक्षेपण संपत्ति "नाम" जोड़ने के लिए प्रक्षेपण कॉल का उपयोग किया। यह विंचेस्टर विंचेस्टर विंचेस्टर विनचेस्टर लौटाता है, जो तालिका में अंतिम नाम COLUMN है।

आउटपुट =

हाइबरनेट: छात्र से y0_ रूप this_.last_name चयन this_ विनचेस्टर विनचेस्टर विनचेस्टर विनचेस्टर

नोट - हम केवल एक प्रक्षेपण, जोड़ सकते हैं अगर हम 1 से अधिक प्रोजेक्शन जोड़ें पिछले एक ओवरराइड किया जाएगा। आप एक से अधिक प्रक्षेपण जोड़ना चाहते हैं तो आप ProjectionList वर्ग nedd जाएगा

Orignal तालिका -

enter image description here

संबंधित मुद्दे