Votre solution de travail est bonne (et similaire à ce que j'ai utilisé auparavant ). Si vous ne souhaitez lier qu'une seule fois, vous pouvez utiliser une vue CTE ou intégrée pour fournir la valeur à la vraie requête :
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
Il n'y a donc qu'un seul espace réservé à lier.
Cependant, je ne vois pas vraiment de problème avec une branche du côté Java, à moins que votre requête réelle ne soit beaucoup plus compliquée et n'entraîne une duplication importante.