我使用spring-jpa和hibernate实现。 我用mariadb 我尝试使用连接进行更新。
我的对象结构
@Entity
public class Room {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roomId;
@ManyToOne
@JoinColumn(name = "appartment_id")
private Appartment appartment;
}
@Entity
public class Appartment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long appartmentId;
@OneToMany
@JoinColumn(name="appartment_id")
private Set<Room> roomList;
}
我的SQL查询
update Room r1 set r1.available = :availability
where r1.roomId in (
SELECT r2.roomId
from Room r2
JOIN r2.appartment a1
WHERE a1.appartmentId = :appartmentId
也尝试了
update Room r1 set r1.available = :availability
where exists
( SELECT r2
from Room r2
JOIN r2.appartment a1
where a1.appartmentId= :appartmentId
)
我收到此错误
java.sql.SQLException:表&#39;房间&#39;被指定两次,两者都作为&#39;更新&#39;的目标。并作为数据的单独来源
似乎更新并加入mysql似乎不可能?
答案 0 :(得分:3)
每当您收到意外令牌异常时,请查找语法错误。
在您的情况下,更新查询应如下所示:
UPDATE Room r1
SET r1.available = :availability
WHERE r1.roomId in
( SELECT r2.roomId FROM Room r2 JOIN r2.appartment a1 WHERE a1.appartmentId = :appartmentId )
编辑(后续问题):
Here you may find some help for your follow-up question
接受的答案包含一个关于如何使用JOIN执行更新的MySQL示例。我很确定你所追求的是什么。现在它看起来像这样:
UPDATE Room r1 JOIN r1.appartment a1
SET r1.available = :availability
WHERE a1.appartmentId = :appartmentId
尝试用你的方言,但如果它不起作用,下面的一个应该做的伎俩:
UPDATE Room r1 SET r1.available = :availability WHERE r1.appartment.appartmentId = :appartmentId
答案 1 :(得分:0)
IN ( SELECT ... )
表现不佳。由于您正在查看UPDATE
,因此我建议使用多表UPDATE
。或EXISTS
很好 - 但不 EXISTS
。您没有将Room
的两个实例绑定在一起; UPDATE
将更改行的所有或 none !
由于你还没有解释查询应该做什么,我不能告诉你如何做。