あなたの作業ソリューションは問題ありません(そして
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
したがって、バインドするプレースホルダーは1つだけです。
ただし、実際のクエリがはるかに複雑で重大な重複につながる場合を除いて、Java側のブランチに問題はありません。