2011-06-21 21 views
6

के लिए मेरे सभी पैरामीटर नहीं पढ़ रहा है मेरे पास निम्नलिखित जेडीबीसी कोड है। ध्यान दें कि मैं PostGIS भूगोल उपयोग करने का प्रयास कर रहा हूँ:प्रीपेडस्टेटमेंट पोस्टजीआईएस भूगोल

PreparedStatement stmt = db.prepareStatement("INSERT INTO " + 
        "source_imagery (image_path, boundary, image_time)" + 
        " VALUES (?, ST_GeographyFromText('POLYGON((" + 
        "? ?, ? ?, ? ?, ? ?))'), ?)"); 

      stmt.setString(1, file.getAbsolutePath()); 
      stmt.setDouble(2, bounds.getY()); 
      stmt.setDouble(3, bounds.getX()); 
      ... 

मैं कोड की अंतिम पंक्ति पर निम्न अपवाद हो रही है:

org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2. 

मैं समझता हूँ कि यह सोचता है कि मैं केवल 2 पैरामीटर है, लेकिन आप देख सकते हैं कि मेरा इरादा 10 होना है। मुझे यकीन नहीं है कि यह POLYGON के भीतर किसी भी पैरामीटर को क्यों नहीं पढ़ रहा है। मुझे पता है कि यह SQL कथन काम करता है अगर मैं इसे सीधे डेटाबेस में उपयोग करता हूं, लेकिन मुझे यकीन नहीं है कि मुझे अपने जावा कोड में इसे काम करने के लिए क्या बदलना है। कोई विचार?

'POLYGON((? ?, ? ?, ? ?, ? ?))' 

एक SQL स्ट्रिंग शाब्दिक कि सिर्फ आठ प्रश्न चिह्न शामिल करने के लिए होता है:

उत्तर

8

आपका समस्या यह है कि यह है। चूंकि यह एक एसक्यूएल स्ट्रिंग शाब्दिक है, इसके अंदर कोई भी प्रश्न चिह्न प्लेसहोल्डर्स नहीं माना जाता है। इससे आपको दो प्लेसहोल्डर्स मिलते हैं: VALUES सूची की शुरुआत में और एक बहुत ही अंत में।

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

VALUES (?, ST_GeographyFromText(?), ?) 

के रूप में यह एक स्ट्रिंग के अंदर शाब्दिक नहीं है ST_GeographyFromText अंदर प्लेसहोल्डर एक प्लेसहोल्डर के रूप में देखा जाएगा और आप इसे एक मूल्य देने के लिए उपयोगकर्ता stmt.setString कर सकते हैं।

+0

आह, मैं समझता हूँ। एक बहुत स्पष्ट स्पष्टीकरण के लिए धन्यवाद। मैं इसकी सराहना करता हूं। – Steph

6

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

जावा में पूरी स्ट्रिंग बनाने के मामले में संभव नहीं है (उदाहरण के लिए मेरे मामले में यह बहुत घुसपैठ कर रहा था) आप प्लेसहोल्डर को शाब्दिक के बाहर ले जाकर और फिर पीजीएसक्यूएल स्ट्रिंग कॉन्सटेनेशन ऑपरेटर का उपयोग करके समस्या के आसपास काम कर सकते हैं:

ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')') 

आपके मामले में समाधान होगा:

ST_GeographyFromText('POLYGON((' || ? || ' ' || ? || ', ' || ? || ' ' || ? || 
    ', ' || ? || ' ' || ? || ', ' || ? || '' || ? || '))') 

बहुत पठनीय नहीं है, लेकिन यह काम करता है ...

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