安全地动态绑定hql中的字段

时间:2016-10-11 22:54:02

标签: hql

我希望生成hql查询,其中可以在运行时选择持久化对象变量及其值(为了更新单个字段)。即如下所示:

String field, value;
String queryString = "update User u set u."+field+" = "+ value +" where (someCondition)"

此代码有效,但对于hql注入不安全。尝试使用命名参数方法

执行此操作
Update user u set :field = :value where (someCondition)

抛出querySyntaxException:

"expecting IDENT, found ":"; 

尝试使用查询字符串"... u.?=? ..."

进行位置绑定时出现类似错误

1 个答案:

答案 0 :(得分:0)

其他人正在寻找如何做到这一点: 我已经意识到为什么它可能无法防止hql注入字段名称:最终用户不应该知道我的对象变量名称[* facepalm]。 / p>

所以我可以通过自由连接成员变量的字符串来解决问题,但是使用命名参数来安全地插入该变量的值(用户确实提供了该值)。

String queryString = "update User u set u." +  field + " = :value where (someCondition)";