【问题标题】:Delete using NOT IN clause in HQL在 HQL 中使用 NOT IN 子句删除
【发布时间】:2017-05-08 13:14:01
【问题描述】:

我有一个表 issue_assigned,其中 user_id 为 Integer,问题编号为 Varchar。问题可以分配给多个用户。

现在有一个条件,如果问题先前已分配给 3 个用户,然后管理员只想将其分配给 2 个用户,系统应该删除我编写以下代码的第 3 个用户条目

String hql = "delete from issueAssigned  where issueNumber=:issueNum AND assignedToUserId not in (:userIds)";
Query query = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql);
query.setParameter("issueNum", issueNum);
query.setParameter("userIds", userIds);
if(query.executeUpdate() > 0){
    return "success";
}else{
    return "error";
}

userIds 是一个字符串,其中包含用逗号(,)分隔的 userId。执行时我得到 String cannot be cast to integer 错误。

如何保留所需用户并删除其余用户?我需要做哪些改变?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    userIds 是一个字符串,其中包含用逗号(,)分隔的 userId

    不应该。您应该只传递一个数组或用户 ID 集合。 Hibernate 将通过为每个用户 ID 添加参数占位符,为您创建相应的 SQL 准备语句。

    :userIds 周围的括号也不需要。

    【讨论】:

      【解决方案2】:

      您必须使用setParameterList 而不是只采用一个参数的setParameter,它采用Collection 参数而不是String

      query.setParameterList("userIds", userIds);
      

      【讨论】:

        【解决方案3】:

        您的查询将是

        String hql = "delete from issue_assigned  where issue_number=:issueNum AND assigned_to_user_id not in :userIds";
        

        并使用 query.setParameterList 如下

         query.setParameterList("userIds", userIds);
        

        hibernate 将使用传递的集合创建准备好的语句。

        【讨论】:

          猜你喜欢
          • 2012-03-14
          • 2013-08-14
          • 2016-08-21
          • 1970-01-01
          • 2017-03-05
          • 2011-07-19
          • 1970-01-01
          • 1970-01-01
          • 2011-06-13
          相关资源
          最近更新 更多