Solusi kerja Anda baik-baik saja (dan mirip dengan apa yang Saya telah menggunakan sebelumnya ). Jika Anda hanya ingin mengikat sekali, Anda dapat menggunakan tampilan CTE atau sebaris untuk memberikan nilai ke kueri sebenarnya:
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
Jadi hanya ada satu placeholder untuk diikat.
Saya tidak benar-benar melihat masalah dengan cabang di sisi Java, kecuali jika permintaan Anda yang sebenarnya jauh lebih rumit dan akan menyebabkan duplikasi yang signifikan.