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
使用的内部数组。尝试打印出 ArrayList
的 size()
。我希望这会打印出 1
.
ArrayList
class 可能会在其内部数组的末尾保留备用 space 以允许它快速添加元素。它还将跟踪数组中实际使用了多少元素。
因此,简而言之,您需要执行以下操作:
List<Client> clients = (List<Client>) out.get("P_OUT");
Client client = clients.get(0);
您可能还想考虑在游标由于某种原因 return 无数据的情况下添加一些错误处理。对 List<Client>
的转换也可能在您的 IDE 中显示为警告:@SuppressWarnings("unchecked")
注释应解决该问题。
我正在使用 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")
returnsArrayList
with 10 objects
我怀疑当您看到 10 个对象时,您正在查看 ArrayList
使用的内部数组。尝试打印出 ArrayList
的 size()
。我希望这会打印出 1
.
ArrayList
class 可能会在其内部数组的末尾保留备用 space 以允许它快速添加元素。它还将跟踪数组中实际使用了多少元素。
因此,简而言之,您需要执行以下操作:
List<Client> clients = (List<Client>) out.get("P_OUT");
Client client = clients.get(0);
您可能还想考虑在游标由于某种原因 return 无数据的情况下添加一些错误处理。对 List<Client>
的转换也可能在您的 IDE 中显示为警告:@SuppressWarnings("unchecked")
注释应解决该问题。