使用Spring JPA EntityManager原生查询删库时报SQLGrammarException
问题原因
JDBC预编译机制的参数绑定仅支持绑定值类型参数,不支持绑定数据库标识符(库名、表名、列名等)。你代码中用命名参数:schema传递库名时,JPA底层会自动给字符串类型的参数值添加单引号,最终生成的SQL为DROP DATABASE 'test_schema',不符合MySQL语法要求(库名作为标识符不能被单引号包裹),因此触发语法错误,异常提示里的near ''test_schema''就是多余的单引号导致的。
解决方案
直接通过字符串拼接构造SQL语句,拼接前必须做合法性校验避免SQL注入风险:
// 先校验schema名称是否符合MySQL标识符规则,仅允许字母、数字、下划线,可根据实际需求调整正则 if (!test_schema.matches("^[a-zA-Z0-9_]+$")) { throw new IllegalArgumentException("非法的schema名称"); } // 直接拼接构造SQL String dropSql = "DROP DATABASE " + test_schema; entityManager.createNativeQuery(dropSql).executeUpdate();
如果使用Hibernate作为JPA实现,也可以调用Hibernate提供的标识符转义工具处理库名字符串后再拼接,进一步降低注入风险。
内容的提问来源于stack exchange,提问作者java dev
相关产品推荐
相关产品推荐

