1

我需要动态设置一个表名,以便我使用query.setText(tname,abc)

例如:select a.name from :tname where a.id = '2'

我使用它setText()是因为当我使用setString()它时说“ tname is a invalid parameter”,因为我假设 Hibernate 在设置字符串参数时添加了 ''。

但即使setText()没有帮助,也给出了同样的例外。

如何动态设置表名?

回复 PSR:

所以你的意思是将表名替换为java字符串替换。但是我们不能从休眠中获得对sql注入预防等的支持,对吧?还有我们如何在类似语句的情况下在休眠中绑定参数,

例如:名称如“%:name%”

这也给了我非法参数异常:当我尝试使用 query.setString(name,"def"); 绑定它时,参数不作为命名参数存在。

4

2 回答 2

4

Hibernate 不会为您执行此操作,因为它与PreparedStatements 一起使用,并且您无法准备一个语句,其中正在查询的表尚不知道。

我不明白为什么要将表暴露给最终用户,因此防止 SQL 注入进行常规字符串替换应该很容易。您使用某种业务逻辑从只有您知道的列表中确定正确的表。表名根本不是来自用户输入。

根据您对 RDBMS 的选择,您可能会发现鉴别器列或带有分区的表继承是处理针对不同表进行相同查询的更好方法。

于 2013-06-09T05:03:15.643 回答
1

不能动态设置表名,可以动态设置列名,不能设置表名

试试这样

select a.name from '+table name+'where a.id = '2'
于 2013-06-09T02:18:36.193 回答