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") аннотация должна адресовать это.

Другие вопросы по тегам