当前位置: 首页 > 知识库问答 >
问题:

使用连接或嵌套子查询Hibernate(HQL)进行更新

乐城
2023-03-14

我在创建使用嵌套查询或使用联接更新实体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)

现在Hibernate投球

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

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

共有3个答案

田德馨
2023-03-14

HQL 似乎还不支持 DML 语句中的路径表达式/隐式联接。以下是 jOOQ 的操作方法(在 SQL 中,假设所有路径都是一对一关系):

UPDATE CommitteeMemberShip cms
SET cms.isDeleted = 1
WHERE (
  SELECT Committee.id
  FROM Committee
  WHERE (
    SELECT CommitteeCycle.committeeId
    FROM CommitteeCycle
    WHERE CommitteeCycle.id = cms.committeeCycleId
  ) = Committee.id 
) = :committeeId

您自己的方法不起作用,因为您不必要地重复了< code>CommitteeMemberShip实体。这是一个已知的MySQL限制,参见:MySQL错误1093 -不能在FROM子句中指定更新的目标表

我怀疑这会起作用吗?

UPDATE CommitteeMemberShip cms
SET cms.isDeleted = 1
WHERE cms.committeeCycleId IN (
  SELECT CommitteeCycle.id
  FROM CommitteeCycle cc
  JOIN cc.committee c
  WHERE c.id = :committeeId
)

从Hibernate 6及其对派生表的支持开始,您可能能够像这样解决MySQL的限制(与jOOQ开箱即用的方式相同,参见此处):

UPDATE CommitteeMemberShip cms 
SET cms.isDeleted=1 
WHERE cms.id IN (
  -- Wrap the query once more in a derived table
  SELECT t.id
  FROM (
    SELECT cmsIn.id 
    FROM CommitteeMemberShip cmsIn 
    JOIN cmsIn.committeeCycle cc 
    JOIN cc.committee c WHERE c.id=:committeeId
  ) t
)
农波涛
2023-03-14

试试这个“UPDATE table 1r SET r . column = @ value WHERE r . column IN(" SELECT rd。Id来自r.table2 rd,其中rd。Column='" @value " '和rd。Column = ' " value

慕阳
2023-03-14

试试这个

更新Committee membership CMS set CMS . is deleted = 1,其中cms.id = some(从CommitteeMemberShip cmsIn内部联接cmsIn.committeeCycle cc内部联接cc.committee c中选择cmsIn.id,其中c.id=:committeeId)

 类似资料:
  • 问题内容: 我有以下hibernate映射: 而表如下所示: 我的hibernate查询看起来像: 但是我总是 有人可以帮我如何使它正常工作吗? 问题答案: 您必须使用子查询而不是联接。大致如下: 另外,根据类型的不同,应该以其他格式显示它。

  • 我想执行以下sql查询 如何使用hibernate 3.0为此编写hql查询 我是这样写的 但它显示了hql语法错误

  • 问题内容: 设置以下映射 通知ID是一个整数。现在我需要使用like运算符进行此HQL查询 ATT:它 就像 运算符NOT = (等于运算符) 然后我用 但是不起作用,因为Hibernate抱怨在调用User.id的getter时发生了IllegalArgumentException 即使我使用 这没用 我应该使用什么来传递查询? 问题答案: 根据Hibernate参考: str()用于将数字或时

  • 我正在使用hibernate为一个项目连接到我的数据库。 我想有一个查询,从我的数据库中获得产品与特定语言的描述和名称。我拥有的参数是该语言的简称,因此首先我必须获得该语言的id,然后获得所需语言的文本。 我尝试了下面的hql查询,没有成功。

  • 问题内容: 我在优化Hibernate查询以免执行联接或辅助选择时遇到了麻烦。 执行Hibernate查询(条件或hql)时,例如: …,而where子句检查不需要与其他表进行任何联接的属性…,但是Hibernate仍与其他表进行完全联接(或辅助选择,具体取决于我如何设置fetchMode)。 有问题的对象(GiftCard)有几个ManyToOne关联,在这种情况下(但不一定是所有情况),我希望

  • 我为Hibernate创建了一个自定义类型来存储OffsetDateTime的时间戳和偏移量(因为默认的JPA 2.2/Hibernate 5.2 with java 8支持实现会丢失偏移量信息): 现在,我想比较一下,所以这个JPA-QL查询可以工作: 在这个模型上: } 但这在以下方面失败了: 如何使CustomUserType具有可比性?