我遇到了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,但我无法推断出这种特殊行为。
答案 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的参数列表。当参数列表中元素的数量不同时,不使用缓存中的查询计划。因此,这意味着您的查询通常很难解析和编译。查询速度较慢,数据库负载较高,并且计划缓存中充满了为同一查询生成的计划。