Получение ошибки во время namedParameterJdbcTemplate.batchUpdate (query ..), при использовании в запросе в предложении - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь обновить таблицу в пакетном режиме, используя org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate. namedParameterJdbcTemplate.batchUpdate (query ...) метод;Мой запрос содержит пункт, из-за которого я получаю ошибку SQL, например:

nested exception is com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][1091][10824][4.14.113] Invalid data conversion: Parameter instance [1271, 1272] is invalid for the requested conversion. ERRORCODE=-4461, SQLSTATE=42815.

Ниже приведены мои данные, которые я хочу обновить в пакетном режиме. Это Map of contractId (String) в качестве ключа и значения в виде списка TaskID (Integer) данных:

{10008=[1271, 1272], 10007=[1269, 1270], 10009=[1273, 1274], 10011=[1277, 1278], 10010=[1275, 1276], 10012=[1279], 10006=[1267, 1268]}

where key is the CONTRACT_ID (String) and value is list of TASK_ID ( Integer)
e.g. CONTRACT_ID are 10008, 10007, 10009 etc.
and respective TASK_ID are [1271, 1272], [1269, 1270], [1273, 1274] etc.

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

одиночное обновление

@Override
public int assignUserTask(String customerId, String userId, Map<String, List<Integer>> resultMap)
        throws ApplicationException {

    int totalCount = 0;
    String ts = DateUtils.getCurrentDatetimeStamp();
    String todaysDate = DateUtils.getTodaysDate();

    String query = CommonUtils.buildQuery("UPDATE EM_WF_USER_QUEUE SET", "CURRENT_USER_ID = :currentUserId,",
            "INITIAL_USER_ID = :initialUserId,", "USER_REASSIGN_TYPE_CD = 'GW',",
            "USER_REASSIGN_TIME = :userReassignTime,", "LAST_CENTRAL_QUEUE_DATE = :lastCentralQueueData,",
            "REASSIGN_CENTRAL_DATE = :reassignCentralDate,", "ORG_GW_CRT_TIME = :orgGwCreateTime,",
            "LAST_UPDT_USER = :lastUpdtUser ,", "LAST_UPDT_TIME = :lastUpdtTime",
            "WHERE CONTRACT_ID = :contractId AND TASK_ID IN (:taskIds)",
            "AND CUSTOMER_ID = :customerId AND CURRENT_USER_ID = 'UNASSIGNED'",
            "AND OVERIDE_IND = 'N' AND QUEUE_STATUS != 'CLOSED'");

    try {

        MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("currentUserId", userId);
        params.addValue("initialUserId", userId);
        params.addValue("userReassignTime", ts);
        params.addValue("lastCentralQueueData", todaysDate);
        params.addValue("reassignCentralDate", todaysDate);
        params.addValue("orgGwCreateTime", ts);
        params.addValue("lastUpdtUser", userId);
        params.addValue("lastUpdtTime", ts);
        params.addValue("customerId", customerId);

        for (Entry<String, List<Integer>> entry : resultMap.entrySet()) {
            params.addValue("contractId", entry.getKey());
            params.addValue("taskIds", entry.getValue());

            totalCount += namedParameterJdbcTemplate.update(query, params);
        }
        return totalCount;

    } catch (DataAccessException exp) {
        throw new CustomException(exp, "Exception occured!");
    }
}

пакетное обновление

@ Переопределить общедоступные броски int int assignUserTask (String customerId, String userId, Map> resultMap)CustomException {

    String ts = DateUtils.getCurrentDatetimeStamp();
    String todaysDate = DateUtils.getTodaysDate();

    String query = CommonUtils.buildQuery("UPDATE EM_WF_USER_TASK SET", "CURRENT_USER_ID = :currentUserId,",
            "INITIAL_USER_ID = :initialUserId,", "USER_REASSIGN_TIME = :userReassignTime,",
            "LAST_CENTRAL_QUEUE_DATE = :lastCentralQueueData,", "REASSIGN_CENTRAL_DATE = :reassignCentralDate,",
            "ORG_GW_CRT_TIME = :orgGwCreateTime,", "LAST_UPDT_USER = :lastUpdtUser ,",
            "LAST_UPDT_TIME = :lastUpdtTime", "WHERE CONTRACT_ID = :contractId AND TASK_ID IN (:taskIds)",
            "AND CUSTOMER_ID = :customerId AND CURRENT_USER_ID = 'UNASSIGNED'",
            "AND ACTIVE_IND = 'Y' AND TASK_STATUS != 'CLOSED'");

    try {

        List<MapSqlParameterSource> batchArgs = new ArrayList<>();

        for (Entry<String, List<Integer>> entry : resultMap.entrySet()) {
            MapSqlParameterSource params = new MapSqlParameterSource();
            params.addValue("currentUserId", userId);
            params.addValue("initialUserId", userId);
            params.addValue("userReassignTime", ts);
            params.addValue("lastCentralQueueData", todaysDate);
            params.addValue("reassignCentralDate", todaysDate);
            params.addValue("orgGwCreateTime", ts);
            params.addValue("lastUpdtUser", userId);
            params.addValue("lastUpdtTime", ts);
            params.addValue("contractId", entry.getKey());
            params.addValue("taskIds", entry.getValue());
            params.addValue("customerId", customerId);

            batchArgs.add(params);
        }

        int[] retVal = namedParameterJdbcTemplate.batchUpdate(query,
                batchArgs.toArray(new MapSqlParameterSource[resultMap.size()]));

        return retVal.length;

    } catch (DataAccessException exp) {
        throw new CustomException(exp, "Exception occured!");
    }
}

Я ожидаю, что запросы будут выполняться в пакете, когда я использую namedParameterJdbcTemplate.batchUpdate(query..), но это приводит к ошибке преобразования типа.

Причина: org. springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;плохой SQL грамматика [UPDATE EM_WF_USER_TASK SET CURRENT_USER_ID =?, INITIAL_USER_ID =?, USER_REASSIGN_TYPE_CD = 'GW', USER_REASSIGN_TIME =?, LAST_CENTRAL_QUEUE_DATE =?, REASSIGN_CENTRAL_DATE =?, ORG_GW_CRT_TIME =?, LAST_UPDT_USER =? , LAST_UPDT_TIME =? ГДЕ CONTRACT_ID =? И TASK_ID IN (?,?) И CUSTOMER_ID =? AND CURRENT_USER_ID = 'UNASSIGNED' и ACTIVE_IND = 'Y' AND TASK_STATUS! = 'CLOSED'];вложенное исключение: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc] [1091] [10824] [4.14.113] Недопустимое преобразование данных: экземпляр параметра [1271, 1272] недопустим для запрошенного преобразования. ERRORCODE = -4461, SQLSTATE = 42815 по адресу org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate (SQLExceptionSubclassTranslator.java:93) в org.springframework.jdb.jpg,620namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters (NamedParameterBatchUpdateUtils.java:43) в org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchDPlmeterate.java:357) at com.medicare.mss.daoImpl.ContractDAO.assignUserTask (ContractDAO.java:274) ... еще 164 причины: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc] [1091] [10824] [4.14.113] Недопустимое преобразование данных: экземпляр параметра [1271, 1272] недопустим для запрошенного преобразования. ERRORCODE = -4461, SQLSTATE = 42815 на com.ibm.db2.jcc.am.ed.a (ed.java:677) на com.ibm.db2.jcc.am.ed.a (ed.java:60)на com.ibm.db2.jcc.am.ed.a (ed.java:103) на com.ibm.db2.jcc.am.po.c (po.java:2630) на com.ibm.db2.jccОбъектorg.springframework.jdbc.core. BatchUpdateUtils.java:70)по адресу org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.access $ 000 (NamedParameterBatchUpdateUtils.java:33) по адресу org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdava.rajrara.Up.core.JdbcTemplate.lambda $ batchUpdate $ 2 (JdbcTemplate.java:932) в org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:605) ... еще 169 com.medicare.mpp.exception:Произошла ошибка во время assignUserTask! в com.medicare.mss.daoImpl.ContractDAO.assignUserTask (ContractDAO.java:279) в com.medicare.mss.daoImpl.ContractDAO $$ FastClassBySpringCGLIB $$ 30e66146.invoke () ... в org.apache.tomcat.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.lang.Thread.run (Thread.java:745)

1 Ответ

0 голосов
/ 07 ноября 2019

Я вижу, что проблема в предложении IN в запросе batchUpdate. Пожалуйста, проверьте ссылку ниже. Надеюсь, это поможет: https://github.com/spring-projects/spring-framework/issues/21935

...