hibernate中的setParameterList如何工作?

时间:2012-03-19 07:32:17

标签: java mysql hibernate

我遇到了hibernate的setParameterList api的问题。

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

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()

我查看了Hibernate Documentation for setParameterList,但我无法推断出这种特殊行为。

3 个答案:

答案 0 :(得分:7)

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

您可以使用“普通”Hibernate查询吗?

答案 1 :(得分:1)

只需删除参数名称旁边的括号:

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()

答案 2 :(得分:0)

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