2012-04-26 32 views
6

मेरे अनुप्रयोगों में से एक में, मैं एकाधिक फ़ील्ड/कॉलम पर एक खोज निष्पादित करना चाहता हूं। यह एक उन्नत खोज है और 20 से अधिक फ़ील्ड हैं जिनका उपयोग उपयोगकर्ता परिणाम के लिए खोज सकते हैं। उदाहरण के लिए, यदि कोई उपयोगकर्ता परहाइबरनेट खोज का उपयोग कर उन्नत खोज

  1. बुकिंग आईडी आधारित
  2. यात्री का नाम
  3. यात्री उम्र
  4. स्थान
  5. से
  6. स्थान
  7. बुकिंग स्थिति
  8. का नाम बुकिंग के लिए खोज कर सकते हैं एयरलाइन

और 13 ऐसे क्षेत्र।

मैं और यहाँ इस्तेमाल किया जाना चाहिए सकता है अगर

  1. हाइबरनेट खोजें यह पता लगाने की कोशिश कर रहा हूँ? यदि हां, तो कैसे? मैं हाइबरनेट खोज का उपयोग करके ऐसी जटिल खोज के लिए एक उदाहरण नहीं ढूंढ पाया।

  2. हाइबरनेट खोज के बजाय, मैं बस हाइबरनेट का उपयोग कर सकता हूं और शायद पैरामीटर की संख्या के आधार पर एक बहु थ्रेडेड खोज डिज़ाइन कर सकता हूं। क्या यह एक अच्छा विचार होगा?

  3. क्या यहां हाइबरनेट फ़िल्टर का उपयोग करना संभव है?

क्या कोई इनपुट या संदर्भ लिंक प्रदान कर सकता है?

+0

क्या आप उपयोगकर्ता को अपने क्षेत्र में एक खोज क्षेत्र में प्रवेश करने की उम्मीद कर रहे हैं और फिर कई स्तंभों के खिलाफ परीक्षण करते हैं? या प्रत्येक कॉलम के लिए अलग खोज फ़ील्ड? प्रत्येक कॉलम के लिए –

+0

इसके अलग-अलग फ़ील्ड। –

उत्तर

2

इस तरह के प्रश्नों के लिए, मैं आमतौर पर एक फॉर्म ऑब्जेक्ट के साथ Criteria क्वेरी का उपयोग करता हूं। मैं फिर प्रत्येक पास फॉर्म फ़ील्ड में null की जांच करता हूं, और यदि null नहीं है, तो उस फ़ील्ड का उपयोग करके क्वेरी में Restriction जोड़ें। Criteria क्वेरी का उपयोग जावा कोड को बहुत साफ रखता है और गन्दा स्ट्रिंग concatenation को समाप्त करता है। आपके मामले के लिए एक उदाहरण:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

हाय @ एरॉन, उत्तर के लिए धन्यवाद। मेरी समस्या यह है कि डेटा लगभग 25 टेबल में फैल गया है। तो कहें कि क्या मैं मानदंड का उपयोग कर रहा हूं, यह जुड़ने के साथ एक बड़ा बयान होगा। यह ऐसा कुछ है जिसे मैं स्वच्छ कार्यान्वयन से बचाना चाहता हूं। यदि आप खोज करने के लिए 5-6 फ़ील्ड कहते हैं तो आप जो प्रस्तावित कर रहे हैं वह पूरी तरह से काम करता है। –

+0

यदि आपके पास संबंधों के साथ स्थापित हाइबरनेट इकाइयां हैं, तो हाइबरनेट आपके लिए उन सभी जॉइन का ख्याल रखेगा, और आप उन अन्य तालिकाओं पर उपर्युक्त रणनीति का उपयोग करने में सक्षम होंगे। Hibernate में सोचें, एसक्यूएल नहीं, और उपकरण आपके लिए काम करने दें। – atrain

+0

मुझे यकीन नहीं है कि मैं आपको सही तरीके से समझता हूं। मैं आपको एक उदाहरण देता हूं, मुझे "बुकिंग" की तलाश है जहां "ट्रिप टाइप" "एक तरफा" है। ट्रिप टाइप एक कक्षा में एम्बेडेड है जो 'बुकिंग' कक्षा से 6 स्तर नीचे है। इसलिए मुझे वास्तव में ट्रिप टाइप पर खोज करना होगा, न कि बुकिंग कक्षा पर। अब 20 ऐसे पैरामीटर हो सकते हैं जिन पर मैं खोज करूँगा जो बुकिंग कक्षा से विभिन्न स्तरों पर एम्बेडेड हैं। अगर मुझे मानदंड का उपयोग करके ऐसा करना है, तो मुझे इन स्तरों पर सभी तालिकाओं में शामिल होना होगा जो मुझे लगता है कि यह बहुत बोझिल है। –

0

हां, हाइबरनेट खोज इस तरह के मामले में बहुत उपयोगी होगी। आप फिल्टर का उपयोग कर सकते हैं, लेकिन हाइबरनेट खोज में फ़िल्टर भी हैं।

2

मुझे लगता है कि आपका निर्णय क्षमता की आवश्यकता पर आधारित होना चाहिए। सामान्य हाइबरनेट क्वेरी उन कई क्षेत्रों पर खोज के लिए पर्याप्त हो सकती है।

हाइबरनेट खोज मदद करेगा यदि आप रिवर्स इंडेक्स का उपयोग करके बड़ी मात्रा में डेटा के लिए खोज क्वेरी तेजी से प्राप्त करना चाहते हैं। आपको क्या करना चाहिए उदाहरण के लिए अगले 5 वर्षों में अपनी क्षमता के साथ अपने डेटाबेस को लोड करना है। यदि आपकी सामान्य हाइबरनेट क्वेरी को स्वीकार्य माना जाता है तो मुझे लगता है कि आपको सामान्य हाइबरनेट क्वेरी के साथ रहना चाहिए।

आप बाद के चरण में हाइबरनेट खोज भी पेश कर सकते हैं।

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

+0

आपके उत्तर @ डैनियल के लिए धन्यवाद। यहां मेरी चिंता जटिल कोड की मात्रा है जो क्वेरी उत्पन्न करने के लिए लिखी जानी चाहिए। मैं 25 से अधिक टेबलों से खोज रहा हूं और मैन्युअल रूप से लिखे जाने वाले जोड़ों की संख्या बहुत त्रुटि होगी। –

+0

जटिल कोड के बारे में चिंता करें? Apache Lucene के लिए एक स्तर नीचे जाओ। आपको हाइबरनेट क्वेरी बनाने की ज़रूरत नहीं है, इसके बजाय ल्यूसीन इंडेक्स से पूछें कि आप स्वयं को बनाते हैं। एकमात्र कमी यह है कि आपको अंतर्निहित लुसीन तकनीक को समझने की आवश्यकता है। –

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