【问题标题】:Update using join or nasted sub-query Hibernate (HQL)使用连接或嵌套子查询 Hibernate (HQL) 进行更新
【发布时间】:2014-05-12 07:13:27
【问题描述】:

我在创建使用嵌套查询或使用联接更新实体 CommitteeMembership 的 HQL 时遇到问题,我首先尝试了此查询:

update CommitteeMemberShip cms set cms.isDeleted=1 
where cms.committeeCycle.committee.id=:committeeId

但是生成的 SQL 错误如下:

update CommitteeMemberShip cross join  set isDeleted=1 where committee_id=?

在“交叉连接”之后没有任何 this 会使 Hibernate 抛出 SQLGrammarException

之后,我将查询更改为使用子查询:

update CommitteeMemberShip cms set cms.isDeleted=1 
where cms.id in (select cmsIn.id from CommitteeMemberShip cmsIn inner join 
cmsIn.committeeCycle cc inner join cc.committee c where c.id=:committeeId)

现在休眠抛出

java.sql.SQLException: You can't specify target table 'CommitteeMemberShip' for 
update in FROM clause

任何人都知道如何在 HQL 中编写此更新查询??

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    试试这个

    更新 CommitteeMemberShip cms 设置 cms.isDeleted=1 其中 cms.id = some(从 CommitteeMemberShip cmsIn 内部连接中选择 cmsIn.id cmsIn.committeeCycle cc 内连接 cc.committee c where c.id=:committeeId)

    【讨论】:

    • 我认为这将完全符合第二次尝试的子查询,它会抛出:java.sql.SQLException: You can't specify target table 'CommitteeMemberShip' for update in FROM 子句
    • 我不确定,但试试这个更新 CommitteeMemberShip cms join CommitteeMemberShip cms2 on cms.id=cms2.id set cms.isDeleted=1 where cms2.committeeCycle.committee.id=:committeeId
    • 不能在实体名或别名后写join,会抛出org.hibernate.hql.ast.QuerySyntaxException: expecting "set", found 'join'
    【解决方案2】:

    试试这个 "UPDATE table1 r SET r.column = @value WHERE r.column IN("SELECT rd.Id FROM r.table2 rd WHERE rd.Column='"+@value+"' AND rd.Column='"+value+"' ";

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多