Как список стал параметром в методе put? - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу отправить данные из списка в качестве входных данных для выполнения хранимой процедуры. В приведенном ниже коде весь список переменных, который должен быть отправлен в качестве входного параметра.

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

1 Ответ

1 голос
/ 23 апреля 2020

Тип Map<String[], Object[]> несовместим с тем, что вы пытаетесь ввести: ключ String и значение List<String>.

Существует два решения:

  1. Измените карту, чтобы она была совместимой с вставленными параметрами.

    Map<String, List<String>> mapInputParameter = new LinkedHashMap<>();
    
  2. Если вам нужно использовать исходный тип карты, вам придется изменить способ поместите параметры в карту.

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

    Недостатком является то, что при дальнейшей обработке вы должны проверять, не является ли массив пустым, и приводить явно от Object до List<String>.

Если вы хотите что-то «более универсальное и более универсальное c», я бы go за Map<String, List<Object>>. В любом случае, я не вижу причин использовать массив на карте, если это явно не требуется (у меня нет информации о методе executeSPForInsertData.

...