我使用Spring Boot构建连接到Oracle DB的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");
过程只返回一个结果,但是当我执行代码时,我得到以下错误:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.test.model.Client
在调试模式下,我可以看到out.get("P_OUT")
返回带有10个对象的ArrayList
,第一个是我的客户对象,其他是设置为null
。
我很困惑,我做错了什么并且想要解决它?
答案 0 :(得分:2)
过程返回一个结果
春天怎么知道的?它需要能够处理可以返回任意数量行的游标。对我来说,out.get("P_OUT")
返回List是有道理的。
在调试模式下,我可以看到
out.get("P_OUT")
返回带有10个对象的ArrayList
我怀疑当你看到10个对象时,你正在查看ArrayList
使用的内部数组。尝试打印出size()
的{{1}}。我希望这会打印出ArrayList
。
1
类可以在其内部数组的末尾保留备用空间,以允许它快速添加元素。它还将跟踪数组中实际使用的元素数量。
因此,简而言之,您需要执行以下操作:
ArrayList
您可能还想考虑在游标应该出于任何原因不返回任何数据的情况下添加一些错误处理。对List<Client> clients = (List<Client>) out.get("P_OUT");
Client client = clients.get(0);
的强制转换也可能在IDE中显示为警告:List<Client>
注释应解决此问题。