Spring RowMapper returns ArrayList 一个结果

Spring RowMapper returns ArrayList for one result

我正在使用 Spring 启动来构建连接到 Oracle 数据库的 REST 服务。我也在使用 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");

程序returns只有一个结果,但是当我执行代码时出现以下错误:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.test.model.Client

在调试模式下,我可以看到 out.get("P_OUT")returns ArrayList 有 10 个对象,第一个是我的客户端对象,其他设置为 null

我很困惑,我做错了什么并且需要修复它?

Procedure returns one result

Spring 怎么知道的?它需要能够处理 return 任意行数的游标。对我来说,out.get("P_OUT") return 是一个列表是有道理的。

In a debug mode I can see that out.get("P_OUT") returns ArrayList with 10 objects

我怀疑当您看到 10 个对象时,您正在查看 ArrayList 使用的内部数组。尝试打印出 ArrayListsize()。我希望这会打印出 1.

ArrayList class 可能会在其内部数组的末尾保留备用​​ space 以允许它快速添加元素。它还将跟踪数组中实际使用了多少元素。

因此,简而言之,您需要执行以下操作:

List<Client> clients = (List<Client>) out.get("P_OUT");
Client client = clients.get(0);

您可能还想考虑在游标由于某种原因 return 无数据的情况下添加一些错误处理。对 List<Client> 的转换也可能在您的 IDE 中显示为警告:@SuppressWarnings("unchecked") 注释应解决该问题。