आपका काम करने वाला समाधान ठीक है (और जैसा मैंने पहले इस्तेमाल किया है ) यदि आप केवल एक बार बाइंड करना चाहते हैं, तो आप वास्तविक क्वेरी को मान प्रदान करने के लिए CTE या इनलाइन दृश्य का उपयोग कर सकते हैं:
WITH CTE AS (
SELECT ? AS REAL_VALUE FROM DUAL
)
SELECT C.* -- but not * really, list all the columns
FROM CTE
JOIN CUSTOMERS C
ON (CTE.REAL_VALUE IS NULL AND C.CUSTOMER_ID IS NULL)
OR C.CUSTOMER_ID = CTE.REAL_VALUE
इसलिए बाइंड करने के लिए केवल एक प्लेसहोल्डर है।
हालांकि, मुझे वास्तव में जावा पक्ष की किसी शाखा के साथ कोई समस्या दिखाई नहीं देती है, जब तक कि आपकी वास्तविक क्वेरी बहुत अधिक जटिल न हो और महत्वपूर्ण दोहराव की ओर ले जाए।