Spring:jdbc模板中的上一行[重复]

Posted

技术标签:

【中文标题】Spring:jdbc模板中的上一行[重复]【英文标题】:Spring : previous Line in jdbc template [duplicate] 【发布时间】:2016-03-30 09:55:09 【问题描述】:

我有这个要求:

private List<IWsResponse> getBPartnerDetails(String valueNetwork, String reportLevel2) 
        JdbcTemplate tm = new JdbcTemplate(ds.getDataSource());
        StringBuffer sql =  new StringBuffer("SELECT * FROM XRV_BPARTNERDETAILS where rownum < 10 order by BPartner_ID");
        response = tm.query(sql.toString(),  new BPartnerMapper());
        return response;
    

BPartnerMapper,我想做以下事情:

获取 ResultSet 中的先前元素以将其与实际行进行比较

@Override
    public IWsResponse mapRow(ResultSet rs, int rowNum) throws SQLException 
        rs.previous();
        int prev_Bpartner_ID = rs.getInt("BPARTNER_ID");
        int prev_Location_ID = rs.getInt("BPARTNER_LOCATION_ID");
        int prev_User_ID = rs.getInt("User_ID");
        rs.next();
        int Bpartner_ID = rs.getInt("BPARTNER_ID");
        int Location_ID = rs.getInt("BPARTNER_LOCATION_ID");
        int User_ID = rs.getInt("User_ID");
        // My code
    

我在rs.previous() 中收到错误:

java.sql.SQLException: Invalid operation for forward only resultset : previous

我该如何解决这个问题以获得resultSetprevious 元素

【问题讨论】:

在您创建Statement的位置发布代码 你不应该首先在RowMapper 中使用next()previous()。您应该使用ResultSetExtractor 并简单地迭代结果(保留最后一个并与下一个进行比较)。而不是来回走动。您也不应该在每次需要时都创建一个JdbcTemplate,因为它是一个很重的构造对象,所以在性能方面不是很聪明。 你的用例是什么,为什么需要做这个比较? 【参考方案1】:

您不能在 ResultSet 上调用 prev()next(),因为它已为当前行预初始化。

来自mapRow()的Spring文档:

实现必须实现此方法来映射 ResultSet 中的每一行数据。此方法不应在 ResultSet 上调用 next();它只应该映射当前行的值。

你应该做的是:

    从您的query() 中获取ArrayList。 迭代此列表并进行所需的比较。

【讨论】:

以上是关于Spring:jdbc模板中的上一行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring jdbc模板连接在读取clob对象时关闭异常

Spring04-SpringEL&Spring JDBC数据访问

java数据库连接进化过程(JDBC)

java数据库连接进化过程(JDBC)

spring框架总结(04)----介绍的是Spring中的JDBC模板

Spring Boot JDBC derby 在内存中的配置问题