在 ( ... ) 查询中编写 HQL 的正确方法
Posted
技术标签:
【中文标题】在 ( ... ) 查询中编写 HQL 的正确方法【英文标题】:Proper way of writing a HQL in ( ... ) query 【发布时间】:2010-11-01 00:01:09 【问题描述】:假设我要编写以下 HQL 查询:
FROM Cat c WHERE c.id IN (1,2,3)
将其编写为参数化查询的正确方法是什么,例如
FROM Cat c WHERE c.id IN (?)
【问题讨论】:
【参考方案1】:我不确定如何使用位置参数执行此操作,但如果您可以使用命名参数而不是位置参数,则可以将命名参数放在括号内,并且可以使用来自Query 接口的setParameterList 方法来绑定列表此参数的值。
...
Query query = session.createQuery("FROM Cat c WHERE c.id IN (:ids)");
query.setParameterList("ids", listOfIds);
...
【讨论】:
【参考方案2】:旧版本的 Hibernate 可能在 Query
上没有 setParameterList
方法。您仍然可以在旧版本上调用 setParameter("ids", listOfIds);
以获得相同的效果。
【讨论】:
为什么还是要更改?刚刚花了一个小时弄清楚为什么会发生IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))
。我打电话给setParameter
而不是setParameterList
。 DOH!【参考方案3】:
命名参数比位置参数好,我们应该小心查看顺序/位置 - 虽然命名很容易。
姓名:
Query query = session.createQuery("select count(*) from User"+" where userName=:userName and passWord=:passWord");
query.setString("userName", userName);
query.setString("passWord", passWord);
位置:
Query query=em.createQuery("SELECT e FROM Employee e WHERE e.empId = ? and e.empDepartment = ?");
query.setParameter(1, employeId);
query.setParameter(2, empDepartment);
【讨论】:
完全同意,但这并不能回答我关于 IN(...) 查询的问题以上是关于在 ( ... ) 查询中编写 HQL 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章