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?
warum 'con.createArrayOf ("text" ...' Ist Ihr id of 'TEXT' type? Normalerweise ist es' BIGINT', manchmal 'VARCHAR' – varren
@ 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