Как мне создать оператор alter table с MyBatis? MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL - PullRequest
0 голосов
/ 01 октября 2019

У меня есть следующее

@Mapper
public interface StatMapper {
    @Update("alter table stats reorganize partition #{pFirst},#{pSecond} into ( "
            + "partition #{pSecond} values less than (#{dSecond}) "
            + ");")
    public void updateFirstPartition(@Param("pFirst")String pFirst, @Param("pSecond")String pSecond, @Param("dSecond")LocalDate dSecond);

Это выдает следующую ошибку

2019-09-30 21: 58: 23.067 DEBUG 13728 --- [restartedMain] cssmStatMapper. updateFirstPartition: ==> Подготовка: изменить статистику таблицы, реорганизовать раздел?,? в (раздел? значения меньше, чем (?));
2019-09-30 21: 58: 23.093 DEBUG 13728 --- [restartedMain] cssmStatMapper.updateFirstPartition: ==> Параметры: p20180901 (строка), p20181001 (строка), p20181001 (строка), 2018-10-01(Дата)

Причина: org.springframework.jdbc.BadSqlGrammarException: ### Ошибка обновления базы данных. Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с '' p20180901 ',' p20181001 'в значениях (p20181001' разбиения меньше ('2018-10-' в строке 1

Как я могу выполнить этот оператор alter table, используя MyBatis?

Этот оператор должен выглядеть следующим образом (p0 и p1 заменены p20180901 и p20181001):

alter table stats reorganize partition p0,p1 into (
    partition p1 values less than ('2018-10-01')
);

Ответы [ 2 ]

1 голос
/ 01 октября 2019

${} - текстовая подстановка, а #{} - заполнитель в java.sql.PreparedStatement (подробности см. В FAQ ). Итак, с вашим кодом MyBatis генерирует подготовленный оператор следующим образом ...

PreparedStatement ps = connection.prepareStatement(
  "alter table stats reorganize partition ?,? into (partition ? values less than (?))");

... и он завершается неудачно, потому что вы не можете использовать заполнитель для имени раздела.

Следующее должно работать.

@Update("alter table stats reorganize partition ${pFirst},${pSecond} into ( "
  + "partition ${pSecond} values less than (#{dSecond}) "
  + ")")
0 голосов
/ 01 октября 2019

Я решил, используя ${pFirst},${pSecond} вместо #{pFirst},#{pSecond}.

...