Java 在返回多行的jdbc模板中调用存储过程

Java 在返回多行的jdbc模板中调用存储过程,java,stored-procedures,jdbc,spring-jdbc,simplejdbccall,Java,Stored Procedures,Jdbc,Spring Jdbc,Simplejdbccall,如果我使用返回多行数据的Jdbc模板调用存储过程。例如,存储过程根据某些业务规则返回200条记录。如何一次迭代和处理这些1,我们可以使用自定义行映射器吗 在这里,我可以为一名员工打电话。但我需要一份清单 SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("getEmployeeeRecord"); SqlParameterSource in = new MapSql

如果我使用返回多行数据的Jdbc模板调用存储过程。例如,存储过程根据某些业务规则返回200条记录。如何一次迭代和处理这些1,我们可以使用自定义行映射器吗

在这里,我可以为一名员工打电话。但我需要一份清单

  SimpleJdbcCall jdbcCall = new 
           SimpleJdbcCall(dataSource).withProcedureName("getEmployeeeRecord");
  SqlParameterSource in = new MapSqlParameterSource().addValue("emp_id", id);
        Map<String, Object> out = jdbcCall.execute(in);
        Employee employee = new Employee();
        employee.setId(id);
        employee.setName((String) out.get("out_name"));
        employee.setAge((Integer) out.get("out_age"));
        return employee ;
SimpleJdbcCall jdbcCall=new
SimpleJDBCall(数据源).withProcedureName(“GetEmployeeRecord”);
SqlParameterSource in=new-MapSqlParameterSource().addValue(“emp_id”,id);
Map out=jdbcCall.execute(in);
员工=新员工();
employee.setId(id);
employee.setName((String)out.get(“out_name”);
employee.setAge((整数)out.get(“out_age”);
返回员工;

我做了这样的东西:

@PostConstruct
public void init() {
    jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("name_of_procedure")
            .withCatalogName("catalog_name")
            .withSchemaName("schema_name")
            .declareParameters(
                    new SqlParameter("@NIT", Types.VARCHAR));
}

public List<Student> invocar(Param parameters) {
    jdbcCall.setFunction(false);
    List<Student> listResult = new ArrayList<>();
    MapSqlParameterSource valueParams = new MapSqlParameterSource();
    valueParams.addValue("@NIT", parameters.getNit());
    

    Map<String, Object> resultStoreProcedure = jdbcCall.execute(valueParams);

    List<LinkedCaseInsensitiveMap<String>> linkedCaseInsensitiveMapList = 
    (ArrayList<LinkedCaseInsensitiveMap<String>>) resultStoreProcedure.get("#result- 
     set-1");
    for (LinkedCaseInsensitiveMap<String> linkedCaseInsensitiveMap : 
      linkedCaseInsensitiveMapList) {
        listResult.add(ResumenInversionesSalidaSpTo
                .builder()
                .name(linkedCaseInsensitiveMap.get("name"))
                .lastName(linkedCaseInsensitiveMap.get("last_name"))
                .age(linkedCaseInsensitiveMap.get("age"))
                .nit(linkedCaseInsensitiveMap.get("nit"))
                .build());
    }
    return listResult;
}
@PostConstruct
公共void init(){
jdbcall=newsimplejdbccall(jdbcTemplate)
.withProcedureName(“程序名称”)
.withCatalogName(“目录名称”)
.withSchemaName(“schema_name”)
.申报参数(
新的SqlParameter(“@NIT”,Types.VARCHAR));
}
公共列表invocar(参数){
jdbcCall.setFunction(false);
List listResult=新建ArrayList();
MapSqlParameterSource valueParams=新的MapSqlParameterSource();
valueParams.addValue(“@NIT”,parameters.getNit());
Map resultStoreProcedure=jdbcCall.execute(valueParams);
列表linkedCaseInsensitiveMapList=
(ArrayList)resultStoreProcedure.get(“#result-
第1组“;
对于(LinkedCaseInsensitiveMap LinkedCaseInsensitiveMap:
linkedCaseInsensitiveMapList){
listResult.add(ResumeInVersionEssalidAspto
.builder()
.name(linkedCaseInsensitiveMap.get(“名称”))
.lastName(linkedCaseInsensitiveMap.get(“姓氏”))
.age(linkedCaseInsensitiveMap.get(“age”))
.nit(linkedCaseInsensitiveMap.get(“nit”))
.build());
}
返回列表结果;
}

它针对SQL server数据库工作。

我制作了如下内容:

@PostConstruct
public void init() {
    jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("name_of_procedure")
            .withCatalogName("catalog_name")
            .withSchemaName("schema_name")
            .declareParameters(
                    new SqlParameter("@NIT", Types.VARCHAR));
}

public List<Student> invocar(Param parameters) {
    jdbcCall.setFunction(false);
    List<Student> listResult = new ArrayList<>();
    MapSqlParameterSource valueParams = new MapSqlParameterSource();
    valueParams.addValue("@NIT", parameters.getNit());
    

    Map<String, Object> resultStoreProcedure = jdbcCall.execute(valueParams);

    List<LinkedCaseInsensitiveMap<String>> linkedCaseInsensitiveMapList = 
    (ArrayList<LinkedCaseInsensitiveMap<String>>) resultStoreProcedure.get("#result- 
     set-1");
    for (LinkedCaseInsensitiveMap<String> linkedCaseInsensitiveMap : 
      linkedCaseInsensitiveMapList) {
        listResult.add(ResumenInversionesSalidaSpTo
                .builder()
                .name(linkedCaseInsensitiveMap.get("name"))
                .lastName(linkedCaseInsensitiveMap.get("last_name"))
                .age(linkedCaseInsensitiveMap.get("age"))
                .nit(linkedCaseInsensitiveMap.get("nit"))
                .build());
    }
    return listResult;
}
@PostConstruct
公共void init(){
jdbcall=newsimplejdbccall(jdbcTemplate)
.withProcedureName(“程序名称”)
.withCatalogName(“目录名称”)
.withSchemaName(“schema_name”)
.申报参数(
新的SqlParameter(“@NIT”,Types.VARCHAR));
}
公共列表invocar(参数){
jdbcCall.setFunction(false);
List listResult=新建ArrayList();
MapSqlParameterSource valueParams=新的MapSqlParameterSource();
valueParams.addValue(“@NIT”,parameters.getNit());
Map resultStoreProcedure=jdbcCall.execute(valueParams);
列表linkedCaseInsensitiveMapList=
(ArrayList)resultStoreProcedure.get(“#result-
第1组“;
对于(LinkedCaseInsensitiveMap LinkedCaseInsensitiveMap:
linkedCaseInsensitiveMapList){
listResult.add(ResumeInVersionEssalidAspto
.builder()
.name(linkedCaseInsensitiveMap.get(“名称”))
.lastName(linkedCaseInsensitiveMap.get(“姓氏”))
.age(linkedCaseInsensitiveMap.get(“age”))
.nit(linkedCaseInsensitiveMap.get(“nit”))
.build());
}
返回列表结果;
}

它可以针对SQL server数据库工作。

从API中可以看出,它不受支持。它仅支持单行结果或参数中的结果集。如果您想要处理返回结果集的存储过程,那么您可能应该直接使用
JdbcTemplate
(但该API似乎也表明它实际上并不期望可调用语句返回结果集)。据我从该API所知,它不受支持。它仅支持单行结果或参数中的结果集。如果您想要处理返回结果集的存储过程,那么您可能应该直接使用
JdbcTemplate
(但该API似乎也表明它实际上并不期望可调用语句返回结果集)。