2017-01-17 9 views
7

मेरे पास ओरेकल फ़ंक्शन है जो POINTS% ROWTYPE की एक तालिका लेता है। मैं इस समारोह को जेपीए से मानदंडबिल्डर वर्ग का उपयोग करके कॉल करना चाहता हूं, जिसमें डेटाबेस कार्यों के लिए एक फ़ंक्शन है। जब मैं क्वेरी बनाने का प्रयास करता हूं, तो यह शिकायत करता है कि ऐरेलिस्ट फ़ंक्शन में वैध क्वेरी पैरामीटर नहीं हैं।जेपीए मानदंड बिल्डर: ओरेकल फ़ंक्शन में ArrayList कैसे पास करें?

मैं जेपीए से ओरेकल फ़ंक्शन में एक ऐरेलिस्ट में कैसे पास करूं?

ओरेकल समारोह हस्ताक्षर:

CREATE OR REPLACE FUNCTION LOCATION_CONTAINS 
(
LATITUDE_IN IN DOUBLE PRECISION, 
LONGITUDE_IN IN DOUBLE PRECISION, 
points IN types_pkg.point_array, 
numPoints IN INTEGER 
) 

ओरेकल प्रकार:

create or replace package types_pkg 
as 
type point_array is table of FILTERPOINT%ROWTYPE; 
end types_pkg; 

जेपीए मानदंड बिल्डर कॉल

List<FilterPoint> points = getPoints(location_name); 
int numPoints = points.size(); 

Expression ex = 
      cb.function("LOCATION_CONTAINS", 
      Integer.class, 
      entity.get("latitude"), 
      entity.get("longitude"), 
      cb.literal(points), 
      cb.literal(numPoints)); 

अपवाद:

org.apache.openjpa.persistence.ArgumentException: 
The specified parameter of type "class middle.ware.FilterPoint" is not a valid query parameter. 

अनिवार्य रूप से, मैं फ़ंक्शन कॉल के बाहर बिंदुओं की एक श्रृंखला को पकड़ना चाहता हूं, इसलिए मुझे केवल इसे एक बार लाने की ज़रूरत है (अभी मैं फ़ंक्शन कॉल के अंदर चयन करता हूं, इसलिए यह हर बार फ़ंक्शन कहलाता है, जो संभावित रूप से होता है 100,000 बार।) तो मैं प्रोसेसिंग के लिए फंक्शन में वापस अंक की उस सरणी को पास करना चाहता हूं।

मुझे इस फ़ंक्शन के लिए मानदंड निर्माता का उपयोग करने की आवश्यकता है क्वेरी का केवल एक हिस्सा है।

किसी भी मदद के लिए धन्यवाद।

+0

पहले वहाँ जावा से पैकेज स्तरीय तालिका प्रकार का उपयोग करने के लिए कोई समाधान कर रहे हैं [लाने-ओरेकल की मेज -प्रकार-से-संग्रहीत-प्रक्रिया का उपयोग-JDBC] (http://stackoverflow.com/questions/6410452/fetch-oracle-table-type-from-stored-procedure-using-jdbc)। सिकउंड मुझे लगता है कि मानक जेपीए का उपयोग कर किसी भी उपयोगकर्ता डिफिंड प्रकार (यूडीटी) तक पहुंचने का कोई मौका नहीं है। (2.4 से एक्सप्लिप्स लिंक को हासिल करने के लिए कुछ विस्तार है)। @Andremoniy द्वारा वर्णित समाधान केवल वर्ग स्तर के लिए काम करता है। –

उत्तर

3

इससे मदद मिल सकती है। जैसा कि यह here वर्णित है, उपयोगकर्ता द्वारा परिभाषित TABLE प्रकार के लिए उचित जावा प्रकार java.sql.Array है। मुझे लगता है कि आपको अपनी सूची को इस प्रकार में परिवर्तित करने की आवश्यकता है। यह करने के लिए संभव तरीकों में से एक है, बस आह्वान methodcreateArrayOf अपने कनेक्शन पर (भी इस answer देखें):।

Session session = (Session)em.getDelegate(); 
Connection conn = session.connection(); 
String[] data = points.toArray(new FilterPoint[points.size()]); 
java.sql.Array sqlArray = conn.createArrayOf(typeName, data); 
+0

मुझे java.sql.SQLException मिलता है: असमर्थित सुविधा अपवाद। थोड़ा खुदाई से, ऐसा लगता है कि ओरेकल विशेष रूप से (OracleConnection.createARRAY()) में ऐसा करने का एक और तरीका है, इसलिए मैं इसमें एक नज़र डालूंगा और देख सकता हूं कि यह कैसे काम करता है। – GuitarStrum

+1

अधिक परीक्षण के बाद, मुझे ओरेकल एसक्यूएल-लेवल प्रकार के साथ जाल करने के लिए जेपीए पक्ष से मेरी सरणी नहीं मिल रही है। मैंने पाया कि समान प्रश्नों (जैसे पूंजीकरण और एक STRUCT का उपयोग करके) से सलाह का पालन किया है, लेकिन किसी कारण से यह काम नहीं करना चाहता था। मुझे परियोजना के उस हिस्से को समय सीमा के कारण पकड़ना पड़ा है, लेकिन आपके जवाब के रूप में मुझे सही रास्ते में ले जाना पड़ा, और कोई अन्य जवाब नहीं दिया गया, आपके लिए प्रतिनिधि, और धन्यवाद। – GuitarStrum

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