ऐसा लगता है कि आप तर्क को सीधे स्ट्रिंग में जोड़कर पारित कर रहे हैं। यह एक बहुत बुरा विचार है, क्योंकि इससे SQL इंजेक्शन लग सकते हैं। हमेशा PreparedStatement
का उपयोग करें एस
?
. के साथ प्लेस-होल्डर्स को पैरामीटर पास करने के लिए, उन्हें सीधे क्वेरी स्ट्रिंग में जोड़कर सीधे पास न करें (अधिक तो, आपको '
की आवश्यकता होगी चारों ओर सीमांकक)।
आपके पास कुछ ऐसा हो सकता है:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=?")
stmt.setDate(1, new java.sql.Date(cin.getTime()));
// ? parameters are indexed from 1
ResultSet results = stmt.executeQuery();
वैकल्पिक रूप से, PostgreSQL आंतरिक दिनांक रूपांतरण आमतौर पर काफी अच्छा और लचीला होता है। आप स्ट्रिंग पैरामीटर को पोस्टग्रेएसक्यूएल के साथ डेट पर कास्ट कर सकते हैं:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
यह लचीला है, लेकिन हो सकता है कि आपको तिथि प्रारूप के आधार पर सटीक परिणाम न मिले (आप दिनांक रूपांतरण प्रारूपों के विवरण के लिए PostgreSQL मैनुअल की जांच कर सकते हैं)। आपके द्वारा उपयोग किया जा रहा इनपुट प्रारूप ठीक काम करना चाहिए, हालांकि (कोशिश करें SELECT CAST('2012-05-01' AS DATE)
सीधे PostgreSQL में, उदाहरण के लिए, यह एक सही PostgreSQL दिनांक लौटाएगा।)
ध्यान दें कि new java.sql.Date(cin.getTime())
. का उपयोग करते समय , आपको समय क्षेत्र संबंधी समस्याओं का सामना करना पड़ सकता है। आप java.sql.Date.valueOf(...)
. का उपयोग कर सकते हैं भी।
अपने संपादन के बाद स्पष्ट करने के लिए:
यह काम नहीं करेगा, क्योंकि तिथियां स्वयं SQL सिंटैक्स का हिस्सा होंगी, न कि तार या तिथियां:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
आपको कम से कम '
. का उपयोग करना होगा उद्धरण:<स्ट्राइक> "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
स्ट्राइक> . यहां, कुछ हद तक, आप उम्मीद कर सकते हैं कि पैरामीटर ठीक से स्वरूपित होंगे, लेकिन ऐसा न करें। इसके अलावा, अभी भी CAST('...' AS DATE)
का उपयोग करके स्ट्रिंग डालना होगा या '...'::DATE
।
सबसे आसान तरीका निश्चित रूप से होगा:
String searchQuery = "SELECT * FROM Rooms r where r.id not in (select SOMETHING from search(CAST(? AS DATE), CAST(? AS DATE)))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
ps.setString(1, cinDate);
ps.setString(2, coutDate);
(जैसा कि a_horse_with_no_name ने एक टिप्पणी में बताया है, आपके आंतरिक चयन के कारण सामान्य क्वेरी वैसे भी काम नहीं करेगी।)