RowMapper将多个结果放入list属性

时间:2015-08-19 10:47:36

标签: java spring-jdbc

我想在Spring中运行一个JDBC查询(在SQL Server上),这将(松散地)让我得到下表:

+-----------------+
| ID Text Country |
+-----------------+
| 1  Test US      |
| 1  Test UK      |
+-----------------+

我想把它放在像这样的Java类中:

class TestClass {
    private int id;
    private String text;
    private List<String> country;
}

所以,上面应该只给我一个对象。我可以/如何使用RowMapper执行此操作?如果我有

public TestClass mapRow(ResultSet rs, int rowNum) throws SQLException {
    TestClass test = new TestClass();
    test.setId(rs.getInt("ID"));
    test.setText(rs.getString("Text"));
    return test;
}

我无法真正聚合多行,因为RowMapper(顾名思义)适用于行。

我以前用Hibernate做过这个,但是速度非常慢,所以我希望尽快在SQL Server上生成所有需要的结果。因为我只需要创建JSON对象的结果,我想如果我在String基础上工作就没问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

您必须使用ResultSetExtractor而不是RowMapper。

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

public class DBReader implements ResultSetExtractor {

@Override
public Object extractData(ResultSet rs) throws SQLException,
        DataAccessException {

    Map<String, TestClass> items = new HashMap<String, TestClass>();

    while(rs.next()) {

        TestClass test = items.get(rs.getString("ID"));

        if (test == null) {

            test = new TestClass();
            test.setId(rs.getInt("ID"));
            test.setText(rs.getString("Text"));

        } 

        test.getCountry().add(rs.getString("Country"));
    }

    return items;
}

}

在您的TestClass中,更改您的国家/地区列表持有者,如下所示

    private List<String> country = new ArrayList<String>();