2009-09-11 11 views
5

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

फ़ॉर्म उस आईडी को कॉलम नामों और मानों पर वापस भेजता है। वर्तमान में, मैं स्ट्रिंग्स को एक क्लॉज में एक साथ चिपकाने के लिए सर्वर साइड जावा का उपयोग कर रहा हूं। यह कुछ मामलों में काम करता है, लेकिन यह गुंजाइश है, त्रुटि प्रवण है और अच्छी तरह से स्केल नहीं करेगा।

कोई सुझाव?

धन्यवाद,

डेविड

+2

क्या आप यह बता सकते हैं कि आपको यह क्यों लगता है कि यह गड़बड़ है और त्रुटि प्रवण है? शायद आप इसे चित्रित कुछ नमूना कोड पोस्ट कर सकते हैं। –

उत्तर

0

आप या तो ग्राहक पर या सर्वर पर खोज स्ट्रिंग का निर्माण करने के लिए है। क्लाइंट पर इसे बनाना एक अच्छा समाधान नहीं है (सुरक्षा-वार), इसलिए सर्वर पर इसे बनाने का एकमात्र विकल्प है। निजी तौर पर, मैं एक खोजकर्ता वस्तु का उपयोग या निर्माण करता हूं, जो खोज तारों को प्रभावी ढंग से बनाने के आवर्ती कार्य को संभालता है और वहां से एक वक्तव्य बनाता है।

1

यदि आप ओआरएम (मैं हाइबरनेट का उपयोग करते हैं) का उपयोग कर रहे थे, तो आप मानदंड API: का उपयोग कर सकते हैं, यह आपको शर्तों को व्यवस्थित करने (उदाहरण के लिए लूप का उपयोग करके) को इंगित करने देता है, और परिणामी क्वेरी बनाता है।

देशी एसक्यूएल में, मुझे ऐसा पुस्तकालय नहीं पता है जो ऐसा करेगा। शायद आप हाइबरनेट मानदंड के लिए प्रलेखन और कोड से कुछ प्रेरणा प्राप्त कर सकते हैं?


या:

आप कुछ पर्याप्त रूप से ग्राहक पर जटिल करते हैं (, आप घोंसला की स्थिति कोष्ठक का उपयोग कर सकते हैं ... आप AND और OR के बीच प्राथमिकताओं का प्रबंधन का कहना है), तो आप शायद पहले से ही कर रहे हैं का निर्माण एक डेटा संरचना जो इसे क्लाइंट पर रखती है।

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

0

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

लेकिन आपको ल्यूसीन या हाइबरनेट खोज जैसे पूर्ण टेक्स्ट खोज के लिए समाधान का उपयोग करने पर विचार करना चाहिए, जो जटिल स्थिति के साथ प्रश्नों की आवश्यकता को बहुत कम करता है। पूर्ण पाठ खोज उपयोगकर्ता अनुभव के लिए भी एक बेहतर समाधान है, क्योंकि एक पूर्ण पाठ खोज करने के लिए आसान है और आमतौर पर बेहतर परिणाम प्रदान करता है।

1

मैं तैयार करता हूं और? पैरामीटर के लिए, अगर केवल इंजेक्शन और अन्य गलत रूपांतरण जोखिम से बचने के लिए।

यदि आपके खोज मानदंड आकार में सीमित हैं, तो आप तैयार करने के लिए सभी संभावित प्रश्नों को स्थैतिक रूप से सूचीबद्ध कर सकते हैं।

यदि नहीं, तो आप गतिशील रूप से तैयार प्रश्नों के पूल को बनाए रख सकते हैं। यह एक वेब ऐप के लिए उतना उपयोगी नहीं है, जहां आप शायद तैयार किए गए किसी भी प्रश्न का पुन: उपयोग नहीं करेंगे।

0

मासिमिलियानो फ्लिरी के मानदंड एपीआई को देखने के सुझाव ने मुझे सही दिशा में ले जाया। मैंने "केवल एक जहां खंड" के निर्माण के बारे में बात बंद कर दी और बयान बनाने की आवश्यकता के रूप में इसके बारे में सोचना शुरू कर दिया।

यह मैं एक समाधान के लिए नेतृत्व: विद्रूप-एसक्यूएल: http://code.google.com/p/squiggle-sql/

डॉक्स से:

विद्रूप गतिशील एसक्यूएल SELECT स्टेटमेंट्स पैदा करने के लिए एक छोटे से जावा पुस्तकालय है। यह मीठा स्थान उन अनुप्रयोगों के लिए है जिन्हें जटिल प्रश्नों को रनटाइम में बदलते मानदंडों के साथ बनाने की आवश्यकता होती है। आमतौर पर यह स्ट्रिंग बनाने के तरीके को समझने के लिए काफी दर्दनाक हो सकता है। Squiggle इस दर्द से दूर ले जाता है।

+0

एफवाईआई: प्रारंभिक नज़र में, वह लाइब्रेरी तैयार कथन और पैरामीटर का समर्थन करने के लिए प्रकट नहीं होती है। उदाहरण के लिए, स्ट्रिंग्स लाइब्रेरी द्वारा जेनरेट किए गए एसक्यूएल में सीधे एम्बेडेड दिखाई देती हैं। यह एसक्यूएल इंजेक्शन हमले भेद्यता के लिए नेतृत्व कर सकते हैं। मै गलत हो सकता हूँ... –

0

यदि आप ओआरएम के रूप में हाइबरनेट का उपयोग कर रहे हैं तो ऐसा करने के लिए मानदंड एपीआई का उपयोग करें। कुछ स्थितियों के आधार पर क्लॉज को जोड़ना/निकालना आसान होना चाहिए।

आप एक JDBC क्वेरी हिस्सा लगातार पहला है कि रखने के लिए और के लिए अलग-अलग भाग संलग्न निर्माण कर रहे हैं, तो उदाहरण के लिए:

चयन * ट्रांस जहां userid से =?

और शर्तों पर आधारित संलग्न करें
यदि राशि! = Null तो 'और राशि> संलग्न करें? '

जब तक आप लगातार भाग को अलग-अलग हिस्सों से अलग कर सकते हैं, आपको बहुत अधिक समस्या नहीं होनी चाहिए।

0

एडम माचैनिक द्वारा "विशेषज्ञ SQL सर्वर 2005 विकास" पुस्तक में गतिशील एसक्यूएल से संबंधित अध्याय 7 में कुछ उत्कृष्ट सुझाव हैं। वह प्रदर्शन, रखरखाव और सुरक्षा सहित सभी प्रकार के मुद्दों में डाइव करता है। मैं अपने अध्याय को फिर से लिखने का प्रयास नहीं करूंगा - यह कहने के लिए पर्याप्त है कि वह मानता है कि एसक्यूएल की बात आने पर कम है।

यह SQL सर्वर के लिए विशिष्ट है लेकिन मेरा मानना ​​है कि उसका सामान्य दृष्टिकोण (विशाल जहां क्लॉज बनाम अगर/फिर एसक्यूएल बनाम गतिशील) बोर्ड में लागू किया जा सकता है।

संपादित करें: मुझे लगता है कि यह जोड़ने के लिए उपयुक्त है ... क्लाइंट से इनपुट पर भरोसा न करें, हमेशा SQL में इसका उपयोग करने से पहले अपने इनपुट को पैरामीटर करें।

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