SQLQuery中的Hibernate命名参数

时间:2015-10-01 13:56:36

标签: java hibernate

无法将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中使用命名参数我做错了什么?

2 个答案:

答案 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"});