Life Developer
인생 개발자
[JPA]JPQL - distinct 중복제거

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
  Comments,     Trackbacks