2010-05-11 11 views
18

मैं मानदंड उदाहरण से एन यादृच्छिक पंक्तियों को लाने के बारे में नहीं समझ सकता:हाइबरनेट मानदंड एपीआई: एन यादृच्छिक पंक्तियां प्राप्त करें

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
... 

फिर क्या? मुझे मानदंड एपीआई

के साथ कोई दस्तावेज़ नहीं मिल रहा है इसका मतलब है कि मुझे इसके बजाय एचक्यूएल का उपयोग करना चाहिए?

Thanx!

संपादित करें: मुझे पंक्तियों की संख्या मिलती है:

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult(); 

मैं 0 और अधिकतम के बीच इंडेक्स के साथ एन यादृच्छिक पंक्ति कैसे प्राप्त करूं? Thx फिर से!

उत्तर

43

दरअसल यह मानदंड और थोड़ा सा ट्वीविंग के साथ संभव है।यहां बताया गया है कि:

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
criteria.add(Restrictions.sqlRestriction("1=1 order by rand()")); 
criteria.setMaxResults(5); 
return criteria.list(); 

कोई भी Restrictions.sqlRestriction कीवर्ड 'और' जोड़ देगा; इसलिए इसके प्रभाव को कम करने के लिए, हम एक डमी स्थिति जोड़ देंगे और हमारे रैंड() फ़ंक्शन को इंजेक्ट करेंगे।

+1

परेशान करने के लिए खेद है कि यह सुविधाजनक था और मेरी मदद की! – Nischal

+1

यह अद्वितीय रिकॉर्ड नहीं लौटाता है ... – Imran

+2

एसक्यूएल प्रतिबंधों में 1 = 1 का उद्देश्य क्या है। मुझे इसके साथ सही आउटपुट मिलता है, और इसके बिना मुझे एक त्रुटि मिलती है –

0

आप यादृच्छिक पंक्तियों को कुशलतापूर्वक, क्षमा नहीं कर सकते हैं। हाइबरनेट केवल एसक्यूएल करता है जो करता है, और यादृच्छिक पंक्ति प्राप्त करने के लिए मुझे किसी भी मानक एसक्यूएल कार्यान्वयन का हिस्सा नहीं है - वास्तव में यह मेरे ज्ञान के लिए किसी भी एसक्यूएल का हिस्सा नहीं है जिसे मैं जानता हूं (कोई भी मुझे प्रबुद्ध करता है)।

और जैसे ही हाइबरनेट एक ओ/आर मैपर है, और एक आश्चर्यजनक मशीन नहीं है, यह केवल अंतर्निहित डेटाबेस का समर्थन कर सकता है।

यदि आप आरोही संख्याओं के साथ दायर ज्ञात हैं और शुरुआत और अंत जानते हैं, तो आप कंप्यूटर पर एक यादृच्छिक संख्या उत्पन्न कर सकते हैं और उस पंक्ति के लिए पूछ सकते हैं।

+0

ये उत्कृष्ट विचार हैं, हालांकि दक्षता उनकी मुख्य चिंता नहीं थी। – fabspro

+0

माईस्क्ल रैंड द्वारा क्रमबद्ध करता है() –

1

मानदंड एपीआई इसके लिए सुविधाएं प्रदान नहीं करता है। हालांकि MySQL में, आप ORDER BY RAND() LIMIT n का उपयोग कर सकते हैं, जहां n यादृच्छिक पंक्तियों की संख्या का प्रतिनिधित्व करता है जिन्हें आप लाने के लिए चाहते हैं।

SELECT col1, col2, col3 FROM tbl ORDER BY RAND() LIMIT :n 

आपको वास्तव में इसे एचक्यूएल के रूप में निष्पादित करने की आवश्यकता है।

6

सबसे पहले, ध्यान रखें कि SQL में ऐसा करने का कोई मानक तरीका नहीं है, प्रत्येक डेटाबेस इंजन अपने मालिकाना वाक्यविन्यास का उपयोग करता है। MySQL के साथ, SQL विवरण प्राप्त करने के लिए 5 यादृच्छिक पंक्तियों होगा:

SELECT column FROM table 
ORDER BY RAND() 
LIMIT 5 

और तुम HQL में इस क्वेरी क्योंकि HQL में खंड द्वारा आदेश डेटाबेस के माध्यम से पारित कर दिया है लिख सकता है तो आप किसी भी समारोह का उपयोग कर सकते ।

String query = "SELECT e.attribute FROM MyEntity e ORDER BY RAND()"; 
Query q = em.createQuery(query); 
q.setMaxResults(5); 

हालांकि, HQL के विपरीत, मानदंड API में इस समय आदेश मूल निवासी एसक्यूएल द्वारा समर्थन नहीं करता (HHH-2381 देखें) और वर्तमान स्थिति में है, तो आप इस सुविधा को लागू करने के लिए Order वर्ग उपवर्ग करना होगा। यह करने योग्य है, जिरा मुद्दे का संदर्भ लें, लेकिन बॉक्स से बाहर उपलब्ध नहीं है।

तो, अगर आपको वास्तव में इस प्रश्न की आवश्यकता है, तो मेरी सिफारिश एचक्यूएल का उपयोग करना होगा। बस ध्यान रखें कि यह पोर्टेबल नहीं होगा।

अन्य पाठकों को पोस्ट SQL to Select a random row from a database table जाँच करने के लिए कैसे MySQL, PostgreSQL, Microsoft SQL सर्वर, IBM DB2 और Oracle के साथ इस लागू करने के लिए देखने के लिए चाहते हो सकता है।

+0

हाइबरनेट मुझे बताता है कि "रैंड" के रूप में ऐसा कोई फ़ंक्शन नहीं है, pg @ java7, hmm ... का उपयोग करके क्या गलत है? -> पीजी के मामले में इसकी यादृच्छिक() – Chris

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