使用加入

时间:2016-02-17 19:57:47

标签: mysql hibernate jpa spring-data-jpa mariadb

我使用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似乎不可能?

2 个答案:

答案 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

由于你还没有解释查询应该做什么,我不能告诉你如何做。