Hallo Hibernate-Community,
ich habe folgendes Problem: Ich benutze Hibernate 3.5.5, eine Oracle 10g Datenbank und den dazugehörigen JDBC-Treiber und möchte ein native SQL - Statement absetzen, z.B.
Code:
-- DB-Tabelle
create table mytable(
pk number primary key,
col1 char(5) not null)
// native SQL - Abfrage
"select count(*) from mytable where col1 = :param"
param = "abc" // liefert 0 zurück
param = "abc " // liefert 1 zurück (Leerzeichenproblematik)
Leider wird auf der Datenbank immer char anstatt varchar2 verwendet und das kann ich leider nicht verändern, weil sonst unser anderes Legacy-System nicht mehr funktionieren würde. Ich habe im Internet gelesen, dass man im PreparedStatement setFixedChar aufrufen soll, was auch funktioniert (ich habe ein kleines JDBC-Beispielprogramm erstellt), allerdings weiß ich nicht wie ich Hibernate dazu bewegen kann setFixedChar anstatt setString aufzurufen.
Ich habe auch schon die Sourcen von Hibernate heruntergeladen und einen üblen Hack in StringType (Methoden set und nullSafeSet) eingebaut der funktioniert:
Code:
public void set(PreparedStatement st, Object value, int index) throws SQLException {
if(st instanceof OraclePreparedStatement) {
String strValue=(String)value;
// Oracle behandelt leere Strings "" als Nullwerte
// und lässt keinen Insert/Vergleich etc zu
strValue = strValue.equals("") ? " " : strValue;
((OraclePreparedStatement)st).setFixedChar(index, strValue);
} else {
st.setString(index, (String) value);
}
}
Wenn ich diesen Code in einen eigenen UserType und für alle Datenbanktabellen (automatisch) nutzen könnte oder wenn man dem Oracle JDBC-Treiber mitteilen könnte, dass er automatsich setFixedChar nutzt, dann wär mein Problem behoben.
Ich würde mich echt riesig freuen, wenn mir jemand weiterhelfen könnte.
Viele Grüße
Josef