无法将Hibernate命名参数插入到SQL查询中:
String values="'a', 'b', 'c', 'd'";
SQLQuery query = getSession().createSQLQuery("SELECT * FROM data WHERE value IN (:values)");
query.setParameter("values", values);
List<Object[]> data = query.list(); // returns data: size = 0 ...
但是,如果我要写:
String values="'a', 'b', 'c', 'd'";
SQLQuery query = getSession().createSQLQuery("SELECT * FROM data WHERE value IN (" + values + ")");
List<Object[]> data = query.list(); // returns data: size = 15 ...
第二种方式返回数据而不是第一种方式。
在SQL中使用命名参数我做错了什么?
答案 0 :(得分:7)
values
变量应该是一个列表或一个字符串数组,而不是一个字符串,因为参数在'IN'子句中。
因此,将代码更改为以下代码,它应该可以工作:
String[] values= {"a", "b", "c", "d"};
SQLQuery query = getSession().createSQLQuery("SELECT * FROM data WHERE value IN (:values)");
query.setParameterList("values", values);
List<Object[]> data = query.list();
答案 1 :(得分:2)
你的第二种方法在查询中没有创建一个命名参数,它只是连接一个字符串,你得到一个永久的查询,就像这样:
SQLQuery query = getSession().createSQLQuery("SELECT * FROM data WHERE value IN ('a', 'b', 'c', 'd')");
要使第一个使用Hibernate,您必须传递一个数组或一组对象,而不是单个字符串并使用setParameterList方法。就像:
query.setParameterList("reportID", new Object[]{"a","b","c","d"});