H2 用户定义函数 org.h2.jdbc.JdbcSQLException 非十六进制字符错误
H2 user-defined-function org.h2.jdbc.JdbcSQLException non-hex character error
尝试将 List<String>
传递给 H2 用户定义函数时,出现以下错误:
[{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]
如日志中的片段所示,该列表包含两个字符串:"ABCD" 和 "EFGH"。我试图将这些值传递给 SQL 语句的 IN
子句。
用户定义函数如下所示:
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;
}'
正在从 DAO 方法调用用户定义的函数。我正在使用 Spring 来管理数据库连接,这里是调用方法的片段:
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;
}
我也试过传递一个数组,并在准备好的语句上使用 setObject
——抛出同样的错误。在传入单个字符串并在准备好的语句上调用 setString
时,我能够将用户定义的函数传递给 return,但似乎无法将多个字符串传递给 [= SQL 语句的 15=] 子句。
关于抛出此问题的任何想法?
已解决:
已将输入参数类型声明为 Types.VARCHAR
,更改为 Types.JAVA_OBJECT
并解决了十六进制字符问题:
StoredProcedure.declareParameter(new SqlParameter("idList", Types.JAVA_OBJECT));
尝试将 List<String>
传递给 H2 用户定义函数时,出现以下错误:
[{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]
如日志中的片段所示,该列表包含两个字符串:"ABCD" 和 "EFGH"。我试图将这些值传递给 SQL 语句的 IN
子句。
用户定义函数如下所示:
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;
}'
正在从 DAO 方法调用用户定义的函数。我正在使用 Spring 来管理数据库连接,这里是调用方法的片段:
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;
}
我也试过传递一个数组,并在准备好的语句上使用 setObject
——抛出同样的错误。在传入单个字符串并在准备好的语句上调用 setString
时,我能够将用户定义的函数传递给 return,但似乎无法将多个字符串传递给 [= SQL 语句的 15=] 子句。
关于抛出此问题的任何想法?
已解决:
已将输入参数类型声明为 Types.VARCHAR
,更改为 Types.JAVA_OBJECT
并解决了十六进制字符问题:
StoredProcedure.declareParameter(new SqlParameter("idList", Types.JAVA_OBJECT));