我需要动态设置表名,以便我使用query.setText(tname,abc)
例如:select a.name from :tname where a.id = '2'
我使用setText()
,因为当我使用setString()
时,它会显示“tname is a invalid parameter
”,因为我认为Hibernate会在设置字符串参数时添加''。
但即使是setText()
也无济于事,并给出了同样的例外。
如何动态设置表名?
回复PSR:
所以你的意思是将表名替换为java字符串替换。但是我们不能从hibernate那里获得sql注入预防等的支持吗?另外我们如何在类似语句
的情况下在hibernate中绑定参数例如:名称如“%:name%”
这也给了我非法的参数异常:当我尝试使用query.setString(name,“def”)绑定它时,参数不存在作为命名参数;
答案 0 :(得分:3)
Hibernate不会为您执行此操作,因为它与PreparedStatement
一起使用,并且您无法准备一个语句,其中查询的表尚不可知。
我不明白为什么要将表名称暴露给最终用户,因此阻止SQL注入执行常规字符串替换应该很容易。您可以使用某种业务逻辑从只知道的列表中确定正确的表。表名根本不是来自用户输入。
根据您选择的RDBMS,您可能会发现discriminator列或表继承并使用分区来处理针对不同表进行相同查询的情况的更好方法
答案 1 :(得分:1)
无法动态设置表名。您可以动态设置列名。无法设置表名
试试这个
select a.name from '+table name+'where a.id = '2'