#spring #jboss7.x #jdbctemplate
#spring #jboss7.x #jdbctemplate
Вопрос:
Мне нужно передать объект массива в Oracle 11 DB. Я использую аннотации на основе Spring 3.1
и использую SimpleJdbcCall
для вызова процедуры на сервере JBOSS. Здесь уместно jdbcCall
.
SimpleJdbcCall call = new SimpleJdbcCall(dataSource)
.withoutProcedureColumnMetaDataAccess()
.withProcedureName(IbeginDataBaseConstants.PROCEDURE_CREATE_NEW_ADMIN.VAL)
.declareParameters(new SqlParameter("inUserEmpID", OracleTypes.INTEGER))
.declareParameters(new SqlParameter("inCountryIDs", OracleTypes.ARRAY, "ibo_number_array" ))
.declareParameters(new SqlParameter("inSysRoleID", OracleTypes.INTEGER))
.declareParameters(new SqlParameter("inLoggedIn", OracleTypes.INTEGER))
.declareParameters(new SqlOutParameter("outStatus", OracleTypes.CHAR))
.declareParameters(new SqlOutParameter("outMsg", OracleTypes.VARCHAR));
Как вы можете видеть inCountryIDs
, это массив, который мне нужно отправить.
С помощью Google я смог найти несколько способов отправки массива в БД. Вот первый.
SqlTypeValue value = new AbstractSqlTypeValue() {
protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException {
ArrayDescriptor arrayDescriptor = new ArrayDescriptor(typeName, conn);
ARRAY idArray = new ARRAY(arrayDescriptor, conn, ids);
return idArray;
}
И я добавил его в источник параметров, используя
sourceMap.addValue("inUserEmpID", newAdmin.getEmpId());
sourceMap.addValue("inCountryIDs", value);
sourceMap.addValue("inSysRoleID", newAdmin.getRoleId());
sourceMap.addValue("inLoggedIn", newAdmin.getLoggedInId());
И исключение, которое я получил, было
org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to oracle.jdbc.OracleConnection
Я понял причину, для реализации SqlTypeValue требуется OracleConnection, тогда как Spring передает WrappedConnection .
Итак, я попытался развернуть соединение с помощью WrappedConnection
class с помощью этого кода.
WrappedConnection wrappedConnection = conn.unwrap(WrappedConnection.class);
Но здесь исключение было
Not a wrapper for: org.jboss.jca.adapters.jdbc.WrappedConnection
В другой попытке я попытался преобразовать существующее соединение в WrappedConnection, используя явное приведение с помощью this.
WrappedConnection wrappedConn = (WrappedConnection)conn;
И все равно не повезло.
Исключение.
org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to org.jboss.jca.adapters.jdbc.WrappedConnection
Ну, все, что мне нужно было сделать, это получить базовое соединение, поэтому я попытался использовать его, WrappedConnectionJDK6
чтобы я мог вызвать соответствующий метод там.
WrappedConnectionJDK6 wrappedConnection = (WrappedConnectionJDK6)conn;
приводит к
тому, что org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 не может быть преобразован в org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6
И второй подход
Map in = Collections.singletonMap("inCountryIDs", new SqlArrayValue(idsArray));
Проблема с этим подходом заключается в том, что Collections.singletonMap
возвращает неизменяемую карту. Итак, я не могу использовать его для добавления дополнительных параметров.
Есть ли какой-либо способ, с помощью которого я могу получить базовое соединение в обернутом соединении JBoss? Или есть какой-либо другой механизм, с помощью которого я могу передать параметр массива без необходимости взаимодействия с соединением?