Return 来自 spring 个批处理 ItemReader 的多个项目

Return multiple items from spring batch ItemReader

我有来自 table A 的数据,如下所示:

ID   Name   Subject
1    AAA    music;history;math
2    BBB    music
3    CCC    math;history

并且我已经使用 ItemReader 从这个 table 中获取列表:

public StoredProcedureItemReader<Student> getList() {
    StoredProcedureItemReader<Student> reader = new StoredProcedureItemReader<Student>();
    SqlParameter[] parameters = { 
            new SqlInOutParameter("v_cursor", Types.REF_CURSOR)
            };      
    reader.setDataSource(dataSource);
    reader.setProcedureName("package.GET_STUDENTLIST");
    reader.setRowMapper(new BeanPropertyRowMapper<>(Student.class));
    reader.setParameters(parameters);
    reader.setRefCursorPosition(1);   

    return reader;
}

由于某些原因,我无法更改存储过程,它将 return 主题列中的所有项目(这意味着该列表将有 3 个对象)。如何将 StoredProcedureItemReader 修改为 return 主题栏的单独项目?
我的期望是列表应该有 6 个对象:

ID   Name   Subject
1    AAA    music
1    AAA    history
1    AAA    math
2    BBB    music
3    CCC    math
3    CCC    history

您可以尝试实现您的自定义 RowMapper,如下所示:

 StoredProcedureItemReader<List<Student>> reader = new StoredProcedureItemReader<List<Student>>();
SqlParameter[] parameters = { 
            new SqlInOutParameter("v_cursor", Types.REF_CURSOR)
            };      
    reader.setDataSource(dataSource);
    reader.setProcedureName("package.GET_STUDENTLIST");
    reader.setRowMapper(new RowMapper<List<Student>>(){  
        @Override  
        public List<Student> mapRow(ResultSet rs, int rownumber) throws SQLException { 
            String[] sub = rs.getString(3).split(";");
            List<Student> temp = new ArrayList<Student>();
            for(int i =0 ; i < sub.length ; i ++){
             Student s =new Student();  
             s.setId(rs.getInt(1));  
             s.setName(rs.getString(2)); 
             s.setSubject(sub[i]);
             temp.add(s);
            }

            return temp;  
        }  
        });  
    reader.setParameters(parameters);
    reader.setRefCursorPosition(1);   

    return reader;

请注意,我还更新了 ItemReader class 以期望 List<Student> 而不是 Student class 是的,您可以相应地进行更改以避免 运行 时间异常如 NullPointerException.