HQL이나 JPQL을 사용하면 SQL 못지않게 여러 잡다한 기능을 활용할 수 있는데, 그런 잡다한 기능 줄 일부를 이용해서 N+1 Select 발생을 원천봉쇄할 수 있는 경우도 있습니다.

지금 해결하려는 N+1 Select 문제가 바로 그런 경우중 하나인데, 하려는게 무엇인지 파악해보면 매우 단순합니다. 그냥 item을 제일 많이 가지고 있는 사용자가 누구고 몇개를 가지고 있는지 궁금한 겁니다.

이전에는 루프를 돌면서 일일히 컬렉션 사이즈를 확인했지만... HQL을 이용하면 다음과 같이 할 수 있습니다.

[java]
@Test
public void memberItemWithBatchPatching(){
int mostItemCount = 0;
mostItemCount = (Integer)getSession().createQuery("select max(m.items.size) from Member m").uniqueResult();
System.out.println(mostItemCount);
}
[/java]

이런 쿼리를 작성할 땐 인텔리J의 HQL 콘솔을 사용해서 미리 실행해보면서 만들면 편하겠죠.

실행 결과, 실행 시간, 실제 DB로 날아갈 SQL 등을 참조할 수 있고 이밖에도 Persistence 탭에서 ERD, 매핑 정보 참조 등 여러 기능을 제공하고 있습니다.