我想将多行映射到一个Object中。这是我的resultSet
public class student {
int id;
String name;
List <Integer> marks;
}
我的班级是这样的:
Posts
我尝试使用RowMapper,但这是用于1:1关系b / w行和对象。请建议我采取正确的方法来实现这个目标吗?
提前致谢。
答案 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;
}
});