programing

Join을 사용한 JPA 업데이트

copyandpastes 2022. 10. 1. 21:39
반응형

Join을 사용한 JPA 업데이트

하이버네이트 구현에는 spring-jpa를 사용합니다.나는 mariadb를 사용한다. 나는 join으로 업데이트를 시도한다.

내 객체 구조

@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:테이블 'room'은 'UPDATE'의 타깃으로, 데이터 소스로서 각각 2회 지정됩니다.

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 )  

편집(팔로우업 문제):

여기서 후속 질문에 대한 도움말을 찾을 수 있습니다.

승인된 답변에는 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

IN ( SELECT ... )퍼포먼스 특성이 좋지 않습니다.지금 보고 있으니까UPDATE멀티테이블을 추천합니다.UPDATE또는EXISTS좋긴 한데 그게 아니라EXISTS의 두 인스턴스를 묶지 않았습니다.Room함께,UPDATE행이 전부 또는 전혀 변경되지 않습니다.

문의 내용에 대해 설명해주지 않았기 때문에 어떻게 해야 하는지 조언해 드릴 수 없습니다.

언급URL : https://stackoverflow.com/questions/35466501/jpa-update-with-a-join

반응형