【问题标题】:Proper way of writing a HQL in ( ... ) query在 ( ... ) 查询中编写 HQL 的正确方法
【发布时间】:2010-11-01 00:01:09
【问题描述】:

假设我要编写以下 HQL 查询:

FROM Cat c WHERE c.id IN (1,2,3)

将其编写为参数化查询的正确方法是什么,例如

FROM Cat c WHERE c.id IN (?)

【问题讨论】:

    标签: hibernate hql


    【解决方案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(...) 查询的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2016-01-17
      • 1970-01-01
      • 2019-03-11
      • 2021-11-25
      • 2012-11-13
      相关资源
      最近更新 更多