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