Pitfall: Escaping in JDBC (Spring-JDBC-Template)

In Java benutzt man gerne den ‚_‘ als logischem Trenner. In ORACLE ist dies leider ein Platzhalter für ein Zeichen und sorgt so für eine gefährliche Tücke.
Wenn man unglücklicherweise eine Mustersuche hat mit „%_XXXX_%“ nach welcher gelöscht werden soll, dann löscht man im Zweifelsfalle mehr Kundendaten, als einem lieb ist.

In der Tabelle haben wir 2 Einträge:
AAA_175679_A
AAA_75679_A.

Mit einem Query-String derart „%_75679_%“ erhalten wir selbstverständlich beide Einträge von der Datenbank.

Kein Ergebnis, obwohl ‚\‘ der Default-Escape-Charakter in ORACLE ist:

List<String> queryForList = minervaJdbcTemplate.queryForList(
"select * from t_test where name like '%\\_75679\\_%'", String.class);

Wieder kein Ergebnis, obwohl ‚\\‘ als Escape-Charakter benutzt werden sollte:

queryForList = minervaJdbcTemplate.queryForList("select * from t_test where name like '%\\\\_75679\\\\_%'",
String.class);

Genau unser eines Ergebnis AAA_75679_A, da wir mit der Spezial-Notation {ESCAPE ‚&‘} dem JDBC ‚&‘ als Escape-Charakter vorgeben:

queryForList = minervaJdbcTemplate.queryForList(
"select * from t_test where name like '%&_75679&_%' {ESCAPE '&'}", String.class);