在 ( ... ) 查询中编写 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 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

hibernate之HQL查询

正确的表达式不是 JPQL/HQL 查询中的有效表达式

Hibernate HQL基础

如何编写 hql 查询或条件查询以根据时间戳获取最新记录

如何使用“构造函数”在“选择子句”中为多个表的选定列编写HQL JOIN查询

如何使用 cast 编写 hql 查询?