Spring RowMapper возвращает ArrayList для одного результата
Я использую Spring Boot для создания службы REST, которая подключается к Oracle DB. Я также использую Spring JDBC.
У меня есть следующий код:
jdbcCall.declareParameters(new SqlParameter("P_IN", OracleTypes.VARCHAR));
jdbcCall.declareParameters(new SqlOutParameter("P_OUT", OracleTypes.CURSOR, new ClientMapper()));
MapSqlParameterSource in = new MapSqlParameterSource().addValue("P_IN", "123");
Map out = jdbcCall.execute(in);
Client client = (Client) out.get("P_OUT");
Процедура возвращает только один результат, но когда я выполняю код, я получаю следующую ошибку:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.test.model.Client
В режиме отладки я вижу, что out.get("P_OUT")
возвращается ArrayList
с 10 объектами, первый - это мой объект-клиент, а другие настроены на null
,
Я в замешательстве, что я делаю не так и как это исправить?
1 ответ
Процедура возвращает один результат
Как Spring узнает об этом? Он должен быть в состоянии справиться с курсорами, которые могут возвращать любое количество строк. Для меня это имеет смысл, что out.get("P_OUT")
возвращает список.
В режиме отладки я вижу, что
out.get("P_OUT")
возвращаетсяArrayList
с 10 предметами
Я подозреваю, что когда вы видите 10 объектов, вы смотрите на внутренний массив, используемый ArrayList
, Попробуйте распечатать size()
из ArrayList
, Я ожидаю, что это распечатать 1
,
ArrayList
класс может оставить свободное место в конце своего внутреннего массива, чтобы позволить ему быстро добавить элемент. Он также будет отслеживать, сколько элементов в массиве фактически используется.
Итак, вкратце, вам нужно сделать следующее:
List<Client> clients = (List<Client>) out.get("P_OUT");
Client client = clients.get(0);
Вы также можете рассмотреть возможность добавления некоторой обработки ошибок в ситуации, когда курсор по какой-либо причине не должен возвращать данные. Актерский состав List<Client>
также может появиться как предупреждение в вашей IDE: @SuppressWarnings("unchecked")
аннотация должна адресовать это.