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
.
我有来自 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
.