Java entityManager JPA的createNativeQuery出现setParameter问题
我希望将参数绑定应用于动态本机查询,在该查询中,我要获取的列名将从UI中动态传递(在本例中为emp_id) 下面是示例java代码片段Java entityManager JPA的createNativeQuery出现setParameter问题,java,jpa,hibernate-entitymanager,Java,Jpa,Hibernate Entitymanager,我希望将参数绑定应用于动态本机查询,在该查询中,我要获取的列名将从UI中动态传递(在本例中为emp_id) 下面是示例java代码片段 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(o
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语法异常。有人能帮我一下吗。提前谢谢 正如我在评论中告诉您的那样,
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
此语法用于绑定参数,而不是列名。如果您的列名是动态的,我认为您需要使用StringBuilder(或其他什么,负责SQL注入)来构建它@HBo是的,谢谢您的回答,在我的情况下,表名也是动态的,我的表名也有相同的字符串文字,那么如何处理这个问题呢?除非有更好的解决方案,我不知道,你需要自己做。我将起草一个小示例fetchColumn变量将从UI动态获取,因此,如果用户发送“emp_id,emp_addr”,它将获取地址列,因此sql注入可能会发生,对吗?绝对正确。如果您无法控制字符串的值,则需要确保不会发生任何事情->转义每个特殊字符,一种“经典”方式非常感谢您的技术支持。非常荣幸:)