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

标签 java spring

我想将多行映射到一个对象中。这是我的结果集

Id        Name       Marks
1         A          34
2         b          35

我的类(class)是这样的:

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

我尝试使用 RowMapper,但那是针对行和对象之间的 1:1 关系。请建议我实现这一目标的正确方法?

提前致谢。

最佳答案

Nico Van Belle's approach使用ResultSetExtractor是一条路要走,除非你会返回 Collection<Student>而不是单个Student目的。

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

这是一个粗略的示例:

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();
    }
});

关于java - 如何在单个对象中映射多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42140770/

相关文章:

java - 在 Java 中为变量分配动态名称

java - Gradle sourceCompatibility 对子项目没有影响

java - 没有从字符串值 ('' 反序列化的字符串参数构造函数/工厂方法)

Java:如何使用 "this"访问外部类的实例变量?

java - BigInteger.intValue()>1 给出错误的 boolean 值

java - 使用 Java 读取 LDAP

java - Thymeleaf+Spring,isAuthenticated()/hasRole() 不起作用

java - Spring Boot 默认 H2 jdbc 连接(和 H2 控制台)

java - 我所有 Controller 单元测试的 Spring 3.2.5 错误 "java.lang.AssertionError: No ModelAndView found"

java - 你能在Spring中为@PreAuthorize设置一个动态值吗?