String query = "select t from Team t join fetch t.members";
List<Team> resultList = em.createQuery(query, Team.class).getResultList();
System.out.println("resultList = " + resultList.size());
for (Team t : resultList) {
System.out.println("t.getName()+\"|\"+t.getMembers().size()+\"명\" = " + t.getName()+"|"+t.getMembers().size()+"명");
for (Member m : t.getMembers()) {
System.out.println("m = " + m);
}
}
이걸 실행하면
이렇게 나온다.
중복값이 생긴다는 것이다.
물론 중복값을 일부러 얻을 때도 분명 있을것이다.
그럴 경우가 아닐때 제외를 시키고 싶다면 어케할까?
쿼리에 distinct를 써주면 된다.
String query = "select distinct t from Team t join fetch t.members";
그래서 이렇게 바꾸고 db에서 돌아갈 쿼리를 생각해보면 이상하다.
db에서는 아래 표에서 모든 컬럼의 값이 일치해야 중복이 제거된다.
그런데 distinct 를 넣었을 뿐인데
이렇게 나온다...
중복제거가 되긴했다.
이 의미는 db에서 중복제거를 하지않았고, JPA가 직접 중복제거를 했다는 소리다.
SQL의 distinct 만으로는 중복제거를 100% 하지 못한다는 말이다.
그렇다! JPA에서 distinct 쿼리가 포함된 JPQL을 보면 같은 식별자를 바라보고 있는 Entity를 대상으로 중복제거를
해준다.
증말 똑똑한 놈이다.
'Developer' 카테고리의 다른 글
[JPA]BatchSize - LAZY로딩 시 몇개를 가져올거냐? (0) | 2020.09.22 |
---|---|
[JAP]fetch 조인 - 특징과 한계 (0) | 2020.09.22 |
[JAP]fetch 조인 - 한방쿼리 (0) | 2020.09.22 |
[JPA]JPQL 기본 함수 (0) | 2020.09.21 |
[JPA]COALESCE와 NULLIF (0) | 2020.09.21 |