【问题标题】:Spring RowMapper returns ArrayList for one resultSpring RowMapper 为一个结果返回 ArrayList
【发布时间】:2016-02-26 09:59:49
【问题描述】:

我正在使用 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")returns ArrayList 有 10 个对象,第一个是我的 Client 对象,其他设置为 null

我很困惑,我做错了什么并且必须解决它?

【问题讨论】:

    标签: java spring oracle jdbc spring-jdbc


    【解决方案1】:

    过程返回一个结果

    Spring 是如何知道这一点的?它需要能够处理可以返回任意行数的游标。对我来说,out.get("P_OUT") 返回一个列表是有道理的。

    在调试模式下,我可以看到 out.get("P_OUT") 返回带有 10 个对象的 ArrayList

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

    ArrayList 类可以在其内部数组的末尾保留空闲空间,以允许它快速添加元素。它还将跟踪数组中实际使用了多少元素。

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

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

    您可能还想考虑添加一些错误处理,以防止游标出于某种原因不返回任何数据。转换为 List&lt;Client&gt; 也可能在您的 IDE 中显示为警告:@SuppressWarnings("unchecked") 注释应该解决这个问题。

    【讨论】:

    • 谢谢,这很有帮助!我还意识到它返回一个列表是完全合理的。也许我们应该考虑程序的 out 参数,因为我们知道它应该总是返回一个且只有一个结果,并且 out 参数不应该是游标。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2012-02-16
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多