【问题标题】:setParameter issue with createNativeQuery of entityManager JPAentityManager JPA 的 createNativeQuery 的 setParameter 问题
【发布时间】:2018-05-02 08:36:55
【问题描述】:

我想将参数绑定应用于动态本机查询,其中我正在获取的列名将从 UI 动态传递。(在本例中为 emp_id)。

下面是示例java代码sn-p,

org.hibernate.Query queryMain;
String fetchColumn="emp_id";
String query;
query="select e.:id from Employee e";
queryMain = (org.hibernate.Query) em.createNativeQuery(query).unwrap(org.hibernate.Query.class);
queryMain.setParameter("id", fetchColumn);

但是当我执行这段代码时,我得到了 sql 语法错误异常。当我打印 sql 查询时,我得到如下

select 'emp_id' from Employee

由于该列是在字符串文字中设置的,因此会引发 sql 语法异常。有人可以帮助我吗?提前致谢!

【问题讨论】:

  • 此语法用于绑定参数,而不是列名。如果您的列名是动态的,我认为您需要使用 StringBuilder 构建它(或其他东西,注意 SQL 注入)
  • @HBo 是的,谢谢您的回复,在我的情况下,表名也是动态的,而且我的表名也有相同的字符串文字,那么如何处理呢?
  • 除非有更好的解决方案我不知道,否则您需要自己做。我会起草一个小例子

标签: java jpa hibernate-entitymanager


【解决方案1】:

正如我在评论中告诉你的,setParameter 的全部意义在于绑定参数值并防止 SQL 注入。你不能用它来传递文字,因为它们会被引号包围。 要动态构建查询,您可以执行以下操作:

StringBuilder sb = new StringBuilder();
String fetchColumn = "emp_id"; //take care of SQL injection if necessary
String tableName = Employee.class.getSimpleClassName();
sb.append("select ").append(fetchColumn)
    .append("from ").append(tableName);
String query = sb.toString();
// rest of your code here

【讨论】:

  • fetchColumn 变量将从 UI 动态获取,因此如果用户发送“emp_id, emp_addr”而不是“mp_id”,它也会获取地址列,因此可能会发生 sql 注入对吗?
  • 当然。如果您不控制字符串的值,则需要确保不会发生任何事情 -> 转义每个特殊字符,这是一种“经典”方式
  • 非常感谢您的技术支持。
  • 总是很开心 :)
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 2011-10-09
  • 2021-05-28
  • 1970-01-01
  • 2013-07-25
  • 2011-01-22
  • 2012-04-18
  • 2018-03-01
相关资源
最近更新 更多