Sql 将createNativeQuery与GRANT语句一起使用

Sql 将createNativeQuery与GRANT语句一起使用,sql,jpa,grant,Sql,Jpa,Grant,我正在修复HP Fortify发现的一些代码发现 尝试修复执行GRANT语句的现有查询语句 原始代码: Query grantQuery = entityManager.createNativeQuery("GRANT INSERT ON TABLE " + data + " TO " + username); grantQuery.executeUpdate(); 变量数据只是传递到此持久性类文件中的字符串。变量username是持久性类文件的私有静态最终字符串。还要知道这个用户名属性文件是

我正在修复HP Fortify发现的一些代码发现

尝试修复执行GRANT语句的现有查询语句

原始代码:

Query grantQuery = entityManager.createNativeQuery("GRANT INSERT ON TABLE " + data + " TO " + username);
grantQuery.executeUpdate();
变量数据只是传递到此持久性类文件中的字符串。变量username是持久性类文件的私有静态最终字符串。还要知道这个用户名属性文件是从本地配置文件中提取的

Fortify建议使用准备好的语句,而不是字符串连接

我在grantQuery上玩过设置参数的游戏,但我只是在运行时出错

修改代码以使用setParameters:

Query grantQuery = entityManager.createNativeQuery("GRANT INSERT ON TABLE ?1 TO $2");
grantQuery.setParameter(1, data);
grantQuery.setParameter(2, username);
grantQuery.executeUpdate();
错误: 异常后回滚事务。java.lang.IllegalArgumentException:org.hibernate.QueryParameterException:找不到命名参数[2]


我使用setParameters的语法是否错误?我是否应该使用另一种方法来执行GRANT语句?

您将
“$”
作为第二个参数的前缀,何时应该使用
“?”

感谢您捕获到该错误。我以前在使用另一个变量setParameter syntaxWARN[org.hibernate.util.jdbceptionReporter](RMI TCP连接(19)-127.0.0.1)时看到一个错误,SQL错误:0,SQLState:42601错误[org.hibernate.util.jdbceptionReporter](RMI TCP连接(19)-127.0.0.1)错误:语法错误在“$1”位置或附近:23错误[src.repo.Persistence](RMI TCP连接(19)-127.0.0.1)exception.javax.persistence.PersistenceException:org.hibernate.exception.sqlgrammareException:无法执行本机批量操作查询这似乎不是同一个问题,如果是,您必须至少在问题中说明SQL试图执行的是什么以及这“$1”是什么如果我不清楚的话,我很抱歉。$1是表名的字符串值,用于允许java应用程序将其数据持久化到数据库中。因此,有一个GRANT和REVOKE语句,这取决于您是否希望持久化。我只提供了GRANT语句,因为它们具有相同的语法样式。$2是数据库的用户名。和正如我所说,JPA原生查询不使用这样的$syntax作为参数。如果您通过参数向SQL中输入一些值,那么它必须通过一个“?”,因此会出现错误