inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

17강 조인 - on절을 듣다가 질문드립니다.

161

ildong-dev03

작성한 질문수 2

0

안녕하세요.

스프링입문부터 강의를 듣다가 처음으로 질문드립니다.

17강 조인 - on절을 듣던중

join_on_filtering() Test예제에서 잘 모르겠는 부분이 있어서 질문드립니다.

모든 member를 조회하고 teamA이면 team을 left outer join 으로 조회하는 케이스였는데요

list<Tuple> result 를 loop한 결과 

```

tuple = [Member(id=3, username=member1, age=10), Team(id=1, name=teamA)]

tuple = [Member(id=4, username=member2, age=20), Team(id=1, name=teamA)]

tuple = [Member(id=5, username=member3, age=30), null]

tuple = [Member(id=6, username=member4, age=40), null]

```

이렇게 나왔습니다.

제가 여기서 3번째 항목(index 2)의 Team이 Null인것을 확인하여 결과를 화면에 찍어보다가

result.get(2).get(member).getTeam() 을 했을때

teamB에 대한 select query 없이 TeamB가 출력되는 결과가 나타났습니다.

1. query 결과상 team_id(FK)는 null 이 나왔는데 result.get(2).get(member).getTeam() 과 result.get(2).get(team) 의 차이가 궁금합니다.

2. teamA에 대해 select 했기 때문에 result.get(2).get(member).getTeam() 가 null 이 나오거나 구문을 수행하면 teamB에 대한 select query를 실행할줄알았는데,

LAZY와 상관이 없는것인지, teamB에 대한 select query 없이 teamB에 대한 내용이 출력될수 있는지 궁금합니다.

(select query가 없어서 영속성 컨텍스트 1차캐시에서 바로 불러온줄 알았는데 그 전에 teamB에 대한 조회쿼리가 없었습니다)

ps1. p6spy query로그를 보았을때 궁금한점이 있습니다.

```

/* select member1, team

from Member member1

  left join Team team with member1.team = team and team.name = 'teamA'1 */

select member0_.member_id as member_id1_1_0_, team1_.team_id as team_id1_2_1_, member0_.age as age2_1_0_, member0_.team_id as team_id4_1_0_, member0_.username as username3_1_0_, team1_.name as name2_2_1_ from member member0_ left outer join team team1_ on (member0_.team_id=team1_.team_id and team1_.name=NULL);

```

주석안에 쿼리는 parameter가 잘 나왔는데 밑에 실제 query에는 NULL로 나오고 실제 수행된 결과는 parameter가 잘 적용된 결과가 나옵니다. ㅎㅎ...

ps2. 사내에서 주 RDBMS를 Oracle로 사용하고있습니다.(과거 Oracle ERP를 사용하면서 주 RDBMS로 선택했고, 현재 SAP ERP로 전환하였지만 Legacy System의 DB는 95% 이상 Oracle로 운영되고있습니다)

기존 Legacy는 거의 Mybatis로 query mapping을 하고있는데 orm을 처음 적용하여 개발을 진행해보려고 합니다.

현재 dialect로 Oracle10gDialect를 사용하여 실습중인데 실습한 내용을 바탕으로 실 운영환경에서 잘 적용할 수 있을지 걱정이됩니다.

JPA java

답변 1

2

김영한

안녕하세요. ildong-dev03님

member1 -> teamA

member2 -> teamA

member3 -> teamB

member4 -> teamB

이렇게 연관관계가 형성되어 있습니다.

해당 쿼리에서 데이터를 뽑을 때 left join + on 절의 영향으로 해당 쿼리에서만 데이터가 줄어든 것입니다.

지연로딩은 연관관계가 있으면 데이터를 조회하기 때문에 연관관계가 있으면 조회되는 것이 정상입니다.

Q: select query 없이 teamB에 대한 내용이 출력될수 있는지 궁금합니다.

테스트 데이터를 입력한 내용이 영속성 컨텍스트에 남아있어서 그렇습니다. 테스트 데이터 입력을 완료한 다음에 em.flush(); em.clear();를 함께 호출해주시면 쿼리가 보입니다.

Q: ps1. p6spy query로그를 보았을때 궁금한점이 있습니다.

p6spy의 버그아닌 버그입니다. p6spy는 단순히 ? 부분을 치환하는데, 하이버네이트 주석이 있느면 /* ? /* select =? 이렇게 되면 ?가 2개가 나타납니다. 첫번째 것만 치환하고 두번째 것은 치환하지 못한 것입니다.

Q: ps2. 조언을 드리자면, 잘 운영되고 있는 레거시 시스템에서 시작하기 보다는, 작은 신규 프로젝트부터 조심씩 경험을 쌓는 것을 추천드립니다. 그리고 가장 중요한 것은 기술을 변경할 때는 팀에서 합의가 이루어져야 합니다.

감사합니다.

SpringBoot 4.X에서의 Querydsl 설정

0

62

2

querydsl 오픈소스에 대한 질문

0

65

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

105

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

309

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

67

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

158

1

querydsl sum() 메서드 없어요.

0

156

2

build 디렉터리 생성

0

133

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

111

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

87

1

오타 제보 드립니다.

0

68

2

벌크 연산과 flush, clear

0

75

1

Run As Intellij 로 변경시 Q타입 import 불가

0

84

1

QHello import하기 문제 발생

0

146

2

등록된 함수 보는법(H2Dialect) 질문

0

67

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

189

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

195

1

querydsl 설정 문제

0

220

2

quey dsl 설정부분

0

155

2

count 쿼리 관련 질문입니다!

0

73

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

88

2

(OrderSpecifier)관련 내용 어디있을가요

0

60

1

중급문법 벌크연산에서

0

77

2