2017-09-19 6 views
0

Wenn ein List<String> zu einer H2 benutzerdefinierten Funktion zu übergeben versucht, ich die folgenden Fehlermeldung erhalten:H2 benutzerdefinierte-Funktion org.h2.jdbc.JdbcSQLException nicht-Hex-Zeichen Fehler

[{call MY_USER_DEFINED_FUNCTION(?)}]; SQL state 
[90004]; error code [90004]; Hexadecimal string contains non-hex character: 
"[ABCD, EFGH]"; SQL statement: 
call MY_USER_DEFINED_FUNCTION(?) [90004-192]; nested 
exception is org.h2.jdbc.JdbcSQLException: Hexadecimal string contains non- 
hex character: "[1234, 5678]"; SQL statement: 
call MY_USER_DEFINED_FUNCTION(?) [90004-192] 

Wie der Ausschnitt aus dem Protokoll zeigt, enthält die Liste zwei Zeichenfolgen: "ABCD" und "EFGH". Ich versuche, diese Werte an die Klausel IN einer SQL-Anweisung zu übergeben. Die benutzerdefinierte-Funktion sieht wie folgt aus:

CREATE ALIAS MY_USER_DEFINED_FUNCTION AS 
' 
java.sql.ResultSet getTableContent(java.sql.Connection con, List<String> idList) throws Exception { 
final PreparedStatement statement = con.prepareStatement("SELECT * FROM MY_TABLE WHERE id IN (?)"); 

String ids[] = new String[idList.size()]; 
idList.toArray(ids); 
statement.setArray(1, con.createArrayOf("text", ids)); 

java.sql.ResultSet rs = statement.executeQuery(); 
return rs; 
}' 

Die benutzerdefinierte-Funktion aus einer DAO-Methode aufgerufen wird. Ich verwende Frühling die DB-Verbindungen zu verwalten, hier ein Ausschnitt der rufenden Methode ist:

public List<MyObject> getMyObjects(final List<String> idList) { 

    Map<String, Object> params = new HashMap<>(); 

    params.put("idList", idList); 
    // Execute stored procedure 
    Map<String, Object> output = super.execute(params); 
    // Collect stored procedure results into list 
    List<MyObject> myObjectList = (List<MyObject>) output.get("myResultSet"); 

    return myObjectList; 
} 

ich auch habe versucht, ein Array übergeben, und mit setObject auf der vorbereiteten Anweisung - gleiche Fehler ausgelöst werden. Ich bin in der Lage, die benutzerdefinierte Funktion zurückzugeben, wenn Sie eine einzelne Zeichenfolge übergeben und setString auf der vorbereiteten Anweisung aufrufen, aber scheint nicht, mehrere Zeichenfolgen an die IN-Klausel der SQL-Anweisung zu übergeben.

Irgendwelche Ideen, warum dies geworfen wird?

+0

warum 'con.createArrayOf ("text" ...' Ist Ihr id of 'TEXT' type? Normalerweise ist es' BIGINT', manchmal 'VARCHAR' – varren

+0

@ varren - in diesem Fall ist die Spalten-ID als' VARCHAR' definiert. Ich habe versucht, sowohl 'TEXT' als auch' VARCHAR' zu verwenden die 'con.createArrayOf()' Methode - der selbe Fehler wird jedes Mal ausgelöst Von dem, was ich sagen kann, ist etwas über den Eingabeparameter 'List ' causin g der Fehler geworfen werden soll, aber ich bin ratlos. – adam

Antwort

0

Gelöst:

Hatte der Eingangsparameter Typ als Types.VARCHAR erklärt, zu Types.JAVA_OBJECT geändert und das Problem behoben Hex-Zeichen:

StoredProcedure.declareParameter(new SqlParameter("idList", Types.JAVA_OBJECT)); 
Verwandte Themen