Hallo,
ich bin auf ein Problem bei null-Parametern in JPA gestossen, für das ich bisher keine
Lösung gefunden habe.
Nehmen wir mal das folgende Beispiel einer NamedQuery
Code:
select a
from Artikel a
where
...
and (
:artikelCode is null
or a.code = :artikelCode
)
Mit dem OR-Ausdruck in der Where-Clausel möchte ich den Parameter "artikelCode" optional
machen. Ist der übergebene Parameter null, werden alle Artikel gelesen, ansonsten nur
diejenigen, die den übergebenen Code haben. Die HQL-Query entspricht so ziemlich genau
dem generierten SQL Code (unter Oracle).
Ein Aufruf wie dieser hier
Code:
javax.persistence.Query query = getEntityManager().createNamedQuery(...);
query.setParameter("artikelCode", artikel.getCode()); // Gibt "null" zurück
return query.getResultList();
führt zu SQLGrammarException.
Code:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
...
...
Caused by: java.sql.SQLException: ORA-00932: Inkonsistente Datentypen: NUMBER erwartet, BINARY erhalten
Für mich sieht es so aus, als würde Hibernate unter JDBC statt
Code:
statement.setNull(1, Types.NUMBER);
das hier aufrufen
Code:
statement.setObject(1, null); bzw. statement.setObject(1, longObject); // wobei longObject == null ist
Das ist aber keine "gesicherte Erkenntnis", nur eine Vermutung.
Bug oder Feature? Wie geht Ihr damit um? Gibt es eine andere Lösung unter JPA, wenn man
auf das Zusammenbauen von Queries mit StringBuffer/StringBuilder etc. verzichten möchte
und stattdessen die Parameter in NamedQueries optional machen möchte?
Das da habe ich hier am Laufen
------------------------------------
App-Server: JBoss-4.0.5.GA
Hibernate Version: 3.2.1.GA
Oracle-JDBC: 10.2.0.1.0
------------------------------------
Gruß,
Michael