如何在方法put中把list变成参数?

问题描述 投票:0回答:1

我想把list中的数据作为输入发送,以执行一个存储过程。在下面的代码中,所有包含的变量list都要作为输入参数发送。

public void onClick$btnSend() throws Exception {
    Workbook workbook = new Workbook("D:/excel file/Mapping Prod Matriks _Group Sales Commercial.xlsx");
    com.aspose.cells.Worksheet worksheet = workbook.getWorksheets().get(0);
    com.aspose.cells.Cells cells = worksheet.getCells();
    Range displayRange = cells.getMaxDisplayRange();
    List<String> ParaObjGroup = new ArrayList<String>();
    List<String> ParaObjCode = new ArrayList<String>();
    List<String> ParaProdMatrixId = new ArrayList<String>();
    List<String> ParaProdChannelId = new ArrayList<String>();
    List<String> ParaProdSalesGroupId = new ArrayList<String>();
    List<String> ParaCustGroup = new ArrayList<String>();
    List<String> ParaSlsThroughId = new ArrayList<String>();
    List<Integer> Active = new ArrayList<Integer>();

    for(int row= displayRange.getFirstRow()+1;row<displayRange.getRowCount();row++){
        ParaObjGroup.add(displayRange.get(row,1).getStringValue());
        ParaObjCode.add(displayRange.get(row,3).getStringValue());
        ParaProdMatrixId.add(displayRange.get(row,5).getStringValue());
        ParaProdChannelId.add(displayRange.get(row,7).getStringValue());
        ParaProdSalesGroupId.add(displayRange.get(row,9).getStringValue());
        ParaCustGroup.add(displayRange.get(row,11).getStringValue());
        ParaSlsThroughId.add(displayRange.get(row,13).getStringValue());
        Active.add(displayRange.get(row,14).getIntValue());
    }

    System.out.println(ParaObjGroup);
    System.out.println(ParaObjCode);
    System.out.println(ParaProdMatrixId);
    System.out.println(ParaProdChannelId);
    System.out.println(ParaProdSalesGroupId);
    System.out.println(ParaCustGroup);
    System.out.println(ParaSlsThroughId);
    System.out.println(Active);

    lovService.coba(ParaObjGroup,ParaObjCode,ParaProdMatrixId,ParaProdChannelId,ParaProdSalesGroupId,ParaCustGroup,ParaSlsThroughId,Active);

        }

以及下面的执行存储过程的代码

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {SQLException.class, Exception.class })
public void executeSPForInsertData(DataSource ds,String procedureName,Map<String[], Object[]> inputParameter){
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(paramsDataSourceBean).withProcedureName(procedureName);
    jdbcCall.execute(inputParameter);
}

但我有一个问题,不能在方法中设置列表类型作为参数。put:

@ServiceLog(schema = ConstantaVariable.DBDefinition_Var.PARAMS_DB_SCHEMA, sp = ConstantaVariable.PARAMSProcedure_VAR.PR_SP_FAHMI)
@Transactional(propagation=Propagation.REQUIRED, rollbackFor={Exception.class,SQLException.class})
public void coba(List<String> params1,List<String> params2,List<String> params3,List<String> params4,List<String> params5,
        List<String> params6,List<String> params7,List<Integer> params8){
    Map<String[], Object[]> mapInputParameter = new LinkedHashMap<String[], Object[]>();
    mapInputParameter.put("P_OBJT_GROUP", params1);
    mapInputParameter.put("P_CODE", params2);
    mapInputParameter.put("P_PROD_MATRIX_ID", params3);
    mapInputParameter.put("P_PROD_CHANNEL_ID", params4);
    mapInputParameter.put("P_PROD_SALES_GROUP_ID", params5);
    mapInputParameter.put("P_CUST_GROUP", params6);
    mapInputParameter.put("P_SLS_THROUGH_ID", params7);
    mapInputParameter.put("P_ACTIVE", params8);
    ParamsService.getService().executeSPForInsertData(null,ConstantaVariable.PARAMSProcedure_VAR.PR_SP_FAHMI,mapInputParameter);
}
java list dictionary arraylist jdbc
1个回答
1
投票

类型 Map<String[], Object[]> 是不符合你想放的东西。关键是 String 而该值是 List<String>.

有两种解决方案。

  1. 改变地图,使其与插入的参数兼容。

    Map<String, List<String>> mapInputParameter = new LinkedHashMap<>();
    
  2. 如果你需要使用原来的map类型,那么你必须改变将参数放入map的方式。

    Map<String[], Object[]> mapInputParameter = new LinkedHashMap<>();
    mapInputParameter.put(new String[] { "P_OBJT_GROUP" }, new Object[] { params1 });
    mapInputParameter.put(new String[] { "P_CODE" }, new Object[] { params2 });
    

    缺点是,在进一步的处理中,你必须检查数组是否为空,并明确地从 ObjectList<String>.

如果你想要 "更通用、更一般 "的东西,我会选择 Map<String, List<Object>>. 无论如何,我发现没有理由在地图中使用数组,除非它是明确要求的(我没有关于这个数组的信息。executeSPForInsertData 方法。

© www.soinside.com 2019 - 2024. All rights reserved.