如何在单个对象中映射多行?

时间:2017-02-09 15:34:12

标签: java spring

我想将多行映射到一个Object中。这是我的resultSet

public class student {
    int id;
    String name;
    List <Integer> marks;
}

我的班级是这样的:

Posts

我尝试使用RowMapper,但这是用于1:1关系b / w行和对象。请建议我采取正确的方法来实现这个目标吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

Nico Van Belle's approach使用ResultSetExtractor是一种方法,除非您返回Collection<Student>而不是单个Student对象。

实现ResultSetExtractor<T>时,Spring会为您提供完整的ResultSet(从DB返回的所有行)。实现逻辑如何提取数据/对象是您的责任(和自由),您希望作为(完整)结果返回。结果是单个对象,例如设置或列出(学生对象)。

这是一个粗略的例子:

new ResultSetExtractor<Collection<Student>>() {
    @Override
    public Collection<Student> extractData(ResultSet rs) throws SQLException, DataAccessException {
        Map<Integer, Student> studentMap = new HashMap<>();

        while(rs.next()){
            Integer id = rs.getInt(0);
            Student student = studentMap.get(id);

            if (student == null) {
                String name = rs.getString(1);
                student = new Student(id, name); // additional constructor for Student class
                studentMap.put(id, student);
            }

            student.addMark(rs.getInt(3));
        }

        return studentMap.values();
    }
});

答案 1 :(得分:0)

如果不是每1行都会生成一个对象,则可以使用ResultSetExtractor。你的最终解决方案应该类似于这个粗略的例子;

new ResultSetExtractor<Student>() {
    @Override
    public Student extractData(ResultSet rs) throws SQLException, DataAccessException {
        Student student = new Student();
        while(rs.next()){
            // internal logic where you set id, name and add marks to the list
            student.addMark(rs.getInt(3));
        }
        return student;
    }
});