Java hibernate中的setParameterList是如何工作的?

Java hibernate中的setParameterList是如何工作的?,java,mysql,hibernate,Java,Mysql,Hibernate,我对hibernate的setParameterList api有一些问题 我正在尝试将集合传递给SQLQuery并执行“in”子句搜索。记录存在于数据库中并执行原始查询,我能够检索它们,或者如果我只是在相同的Hibernate SQL中替换它们,如emp.emp_name in('Joe','John'),我能够获得所需的结果集。我不明白为什么Hibernate不能替换集合而不是命名参数。代码如下: session.createSQLQuery("select emp_id as id fro

我对hibernate的setParameterList api有一些问题

我正在尝试将集合传递给SQLQuery并执行“in”子句搜索。记录存在于数据库中并执行原始查询,我能够检索它们,或者如果我只是在相同的Hibernate SQL中替换它们,如
emp.emp_name in('Joe','John')
,我能够获得所需的结果集。我不明白为什么Hibernate不能替换集合而不是命名参数。代码如下:

session.createSQLQuery("select emp_id as id from emp where emp.emp_name in (:empNames)")
       .addScalar("id",Hibernate.INTEGER)
       .setParameterList("empNames",new String[]{"Joe","John"})
       .list()
我已经查看了,但是我无法推理出这个特定的行为。

我怀疑问题恰恰是因为您使用的是
createSQLQuery
。这里的单个参数需要在实际的SQL中更改为多个参数,但是通过使用“原始”查询,您告诉Hibernate不要弄乱SQL


是否可以改用“普通”Hibernate查询?

只需删除参数名称周围的括号:

session.createSQLQuery("select emp_id as id from emp where emp.emp_name in :empNames ")
   .addScalar("id",Hibernate.INTEGER)
   .setParameterList("empNames",new String[]{"Joe","John"})
   .list()

我不建议使用(N)Hibernate的参数列表。当参数列表中的元素数不同时,不使用缓存中的查询计划。因此,这意味着您的查询通常是硬解析和编译的。查询速度较慢,数据库负载较高,并且计划缓存中充满了为同一查询生成的计划。

您可能希望提供有关错误的更多信息(例如stacktrace等),以帮助我们了解您的问题。嗨,Thomas,恐怕Hibernate在这种情况下不会引发任何异常。谢谢Jon,当我切换到使用HQL而不是本机SQL时,问题就解决了。我想我应该说这样的查询工作正常,我怀疑您的查询的真正问题是您混合了hibernate/SQL。因此,实际上,您只需要去掉.addScalar(“id”,Hibernate.INTEGER)并将其转换为setParameter(id,theId),因为实际的列表部分很好,并且在我的整个项目中对我非常有用。请添加更多的解释不要在“empNames”时写“in(:empNames)”,而是在“empNames”时写“in:empNames”是SQLQuery的参数列表。