인프런 커뮤니티 질문&답변

Kedric Kim님의 프로필 이미지
Kedric Kim

작성한 질문수

실전! Querydsl

mysql JOIN UPDATE 관련 질문 드립니다 !

작성

·

396

1


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
 

안녕하세요 영한님

 
join update 관련해서 질문드려요
 
위 글을 참고 해서 where 절의 서브쿼리를 사용해서 join update를 사용하였는데요.
 
You can't specify target table '테이블명' for update in FROM clause
 
라는 에러가 나서 구글링을 해보니
mysql 에서 같은 테이블에서 서브쿼리로 값을 끌어오려고 해서 나는 에러라고 하더라구요.
그래서 from 절을 한번 더 감싸는 방식으로 해결한다고 하는데
 
그럼 제 생각으로는 from절에 한번 더 서브쿼리를 넣어야 할 것 같은데
from 절에는 서브쿼리를 넣지 못하지 않나요?
우선 네이티브 쿼리로 처리해두긴했는데 다른 해결방법이 있나 궁금해서 질문드립니다.
 
늘 감사합니다.

답변 1

0

Kedric Kim님의 프로필 이미지
Kedric Kim
질문자

안녕하세요

우선 영한님의 강의를 토대로

 from절에서의 subquery는 안된다는 전제하에

쿼리를 2번 나눠서 실행하였습니다.

(참고로 mysql 기준입니다.)

혹시 다른 방법이 있다면 답변 부탁드립니다

 

- 기존소스

@Test
public void updateSubquery() {

Team team = new Team("teamA");
em.persist(team);

Member newMember = new Member("user1");
newMember.setTeam(team);
em.persist(newMember);

QMember subM = new QMember("subM");
QTeam subT = new QTeam("subT");

long result = queryFactory
.update(member)
.set(member.age, member.age.add(10))
.where(member.id.in(
JPAExpressions.select(subM.id)
.from(subM)
.join(subM.team, subT)
.where(subT.name.eq("teamA"))
))
.execute();

assertThat(result).isEqualTo(1);
}

 

- 수정한 소스

@Test
public void updateSubquery() {

Team team = new Team("teamA");
em.persist(team);

Member newMember = new Member("user1");
newMember.setTeam(team);
em.persist(newMember);

QMember subM = new QMember("subM");
QTeam subT = new QTeam("subT");

List<Integer> list = queryFactory
.
select(subM.id)
.from(subM)
.join(subM.team, subT)
.where(subT.name.eq("teamA"))
)).fetch();

long result = queryFactory
.update(member)
.set(member.age, member.age.add(10))
.where(member.id.in(
list
))
.execute();

assertThat(result).isEqualTo(1);
}
김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Kedric Kim님

저도 다른 방법은 딱 떠오르지 않네요.

혹시 더 나은 방안을 아시는 분 있으면 답변 부탁드려요.

감사합니다.

Kedric Kim님의 프로필 이미지
Kedric Kim

작성한 질문수

질문하기