JPA更新加入

我使用hibernate实现的spring-jpa。 我使用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:表'房间'被指定两次,既作为'UPDATE'的目标,也作为数据的单独来源

看起来像更新和加入MySQL似乎不可能?


每当您收到意外的令牌异常时,查找语法错误。

在你的情况下,更新查询应该如下所示:

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 )  

编辑(后续问题):

在这里,您可能会为后续问题找到一些帮助

接受的答案以MySQL示例为例,介绍如何使用JOIN执行更新。 我很确定这就是你的追求。 现在看起来像这样:

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

IN ( SELECT ... )具有较差的性能特征。 由于您正在查看UPDATE ,我建议使用多表UPDATE 。 或EXISTS是好的-但不是EXISTS 。 你没有把Room的两个实例绑在一起; UPDATE将会改变全部或全部行!

既然你没有解释查询应该做什么,我不能告诉你如何去做。

链接地址: http://www.djcxy.com/p/94681.html

上一篇: JPA update with a join

下一篇: Reduce number of database calls