2017-09-19 31 views
0

、私は次のエラーを取得しています:H2ユーザ定義関数org.h2.jdbc.JdbcSQLException非進文字エラー

[{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] 

として、ログからスニペットが表示され、リストには2つの文字列「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メソッドから呼び出されています。私はここで、呼び出し方法の抜粋ですが、DB接続を管理するために春を使用しています:私はまた、配列を渡して、プリペアドステートメントにsetObjectを使用してみました

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; 
} 

- 同じエラーがスローされます。私は、単一の文字列を渡して、準備されたステートメントでsetStringを呼び出すときに返すようにユーザー定義関数を取得することができますが、複数の文字列をSQLステートメントのIN節に渡すことはできません。

なぜこれがスローされているかに関するアイデアはありますか?

+0

'con.createArrayOf( "テキスト" ...'あなたである理由'TEXT'型のid?通常は' BIGINT'、時には 'VARCHAR'です – varren

+0

@varren - この場合、列IDは' VARCHAR'として定義されています。 'TEXT'と' VARCHAR'の両方を使って試しました。 'con.createArrayOf()'メソッド - 同じエラーが毎回スローされます。私が知る限り、入力パラメタ 'List 'について何かが原因ですgはスローされるエラーですが、私は困惑しています。 – adam

答えて

0

は解決:

は、Types.VARCHARとして入力パラメータの型を宣言しTypes.JAVA_OBJECTに変更し、進文字の問題を解決していた:

StoredProcedure.declareParameter(new SqlParameter("idList", Types.JAVA_OBJECT)); 
関連する問題