我在创建使用嵌套查询或使用联接更新实体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中编写此更新查询??
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
)
试试这个“UPDATE table 1r SET r . column = @ value WHERE r . column IN(" SELECT rd。Id来自r.table2 rd,其中rd。Column='" @value " '和rd。Column = ' " value
试试这个
更新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具有可比性?