반응형
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
반응형
'programing' 카테고리의 다른 글
HTTPS/SSL을 통한 Java 클라이언트 인증서 (0) | 2022.10.01 |
---|---|
MySQL의 JSON 어레이를 행으로 변환 (0) | 2022.10.01 |
함수에서의 디폴트 인수 사용 (0) | 2022.10.01 |
Larabel - 임시 삭제 - 투고를 다른 테이블로 이동 (0) | 2022.10.01 |
Linux에서 Mariadb 10과 호환되는 ODBC 드라이버가 있습니까? (0) | 2022.10.01 |