Mybatis Spring Batch: как удалить из нескольких таблиц с предложением where в Tasklet? - PullRequest
0 голосов
/ 29 июня 2018

Я хочу сделать несколько удалений из разных таблиц, например так:

DELETE FROM TABLE1 WHERE T1_ID = :id AND T1_CREATION_DATE IS NULL;
DELETE FROM TABLE2 WHERE T2_ID = :id AND T2_CREATION_DATE IS NULL;
COMMIT;

но с подпружиненной партией.

пока я пробовал:

String query = "DELETE FROM TABLE1 WHERE T1_ID = :id AND T1_CREATION_DATE IS NULL;"+
"DELETE FROM TABLE2 WHERE T2_ID = :id AND T2_CREATION_DATE IS NULL;"+
"COMMIT;";

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    jobContext = stepExecution.getJobExecution().getExecutionContext();

    Employee employee = (Employee) jobContext.get("employee");

    Map<String, Object> parameters = new HashMap<String, Object>();

    parameters.put("id", employee.getId());

    new NamedParameterJdbcTemplate(dataSource).update(query,parameters);

    return RepeatStatus.FINISHED;
}

он компилируется, но я получил неправильное исключение грамматики SQL, думаю, это потому, что JdbcTemplates не управляет транзакционным запросом.

Любой намек?

PS: для моих читателей и писателей я использую Mybatis, есть ли способ, которым он может обрабатывать множественное удаление? Я пытался, но мне не удалось использовать SQL-запрос mybatis в тасклете

1 Ответ

0 голосов
/ 02 июля 2018

Благодаря вашей помощи мне удалось заставить его работать.

Сначала я сделал это с помощью отдельных шаблонов, таких как:

protected String expDelete = "DELETE FROM TABLE1 WHERE ID = :id AND CREATION_DATE IS NULL";
protected String dipDelete = "DELETE FROM TABLE2 WHERE ID = :id AND CREATION_DATE IS NULL";

Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", employeeInTreatment.getId());

new NamedParameterJdbcTemplate(this.dataSource).update(expDelete,parameters);
new NamedParameterJdbcTemplate(this.dataSource).update(dipDelete,parameters);

это вроде работает (компиляция, но удаления не были зафиксированы). Но я был уверен, что смогу сделать это за один раз.

Я создал сервис и дао, указывающий на мой mybatis mapper:

employeeBatchDao.deleteEmployeeImportedData(employeeId);

<delete id="deleteEmployeeImportedData" parameterType="Integer">
   {call
       declare
       begin
           DELETE FROM TABLE1 WHERE ID = :id AND CREATION_DATE IS NULL;
           DELETE FROM TABLE2 WHERE ID = :id AND CREATION_DATE IS NULL;
       end
    }

я назвал это в моем тасклете, и это сработало! теперь я могу сделать все свои удаления за один раз!

...