我有以下
@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调试13728--[restartedMain] c.s.s.m.StatMapper.updateFirstPartition:==>准备:alter table stats重新组织分区?,? into(分区?值小于(?));
2019-09-30 21:58:23.093调试13728 --- [restartedMain] cssmStatMapper.updateFirstPartition:==>参数:p20180901(String),p20181001(String),p20181001(String),2018-10-01(日期)
引起原因:org.springframework.jdbc.BadSqlGrammarException:
###更新数据库时出错。原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误。检查与您的MySQL服务器版本对应的手册以获取正确的语法,以在'p20180901','p20181001'附近使用(分区'p20181001'的值小于('2018-10-'在第1行
如何使用MyBatis发出此
alter table
语句?该语句应如下所示(用
p0
和p1
替换p20180901
和p20181001
):alter table stats reorganize partition p0,p1 into (
partition p1 values less than ('2018-10-01')
);
最佳答案
${}
是文本替换,#{}
是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}) "
+ ")")