Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java entityManager JPA的createNativeQuery出现setParameter问题_Java_Jpa_Hibernate Entitymanager - Fatal编程技术网

Java entityManager JPA的createNativeQuery出现setParameter问题

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

我希望将参数绑定应用于动态本机查询,在该查询中,我要获取的列名将从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(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注入可能会发生,对吗?绝对正确。如果您无法控制字符串的值,则需要确保不会发生任何事情->转义每个特殊字符,一种“经典”方式非常感谢您的技术支持。非常荣幸:)