인프런 커뮤니티 질문&답변
외래키에 해당하는 컬럼으로 조회하고 싶을때는 어떻게 하면 될까요???
작성
·
2.3K
1
특정 팀 소속인 사용자 목록을 얻고 싶다면
Member Repository에서 아래와 같이 만들어서
findByTeam(Team team, Pageable pageable);
Team 객체에 해당하는 Team의 id 값을 담아서 조회 하고 있는데 이러한 방식 맞나요??
퀴즈
순수 JPA 리포지토리 구현과 비교했을 때, Spring Data JPA 사용의 주요 장점은 무엇일까요?
복잡한 SQL 쿼리를 직접 작성할 필요가 전혀 없습니다.
기본적인 CRUD 작업을 위한 구현 코드를 직접 작성할 필요가 없습니다.
트랜잭션 관리를 수동으로 처리하여 더 세밀한 제어가 가능합니다.
엔티티의 변경 감지(Dirty Checking) 기능이 새롭게 추가됩니다.
답변 4
2
안녕하세요. dksrudwns님
findByTeam과 같이 해결하는 방법이 맞습니다.
이게 어색하면 다른 해결 방안으로는 다음과 같이 ID를 직접 조회하는 JPQL을 작성하시면 됩니다.
@Query("select m from Member m where m.team.id = :teamId")
Member findByTeamJpql(@Param("teamId") Long id);
추가로 findByTeamId(Long id) 또는 findByTeam_id(Long id)를 사용하셔도 되는데, 이 방식은 불필요한 조인이 발생합니다.(스프링 데이터의 한계)
감사합니다^^
0
안녕하세요. alkooper5님
우선 이 내용을 이해하려면 JPA 기본편 강의
섹션 11. 객체지향 쿼리 언어 - 중급 문법 -> 엔티티 직접 사용에 대해서 알아야 합니다.
다음과 같이 JPQL을 작성하면
select m from Member m where m.team.id = :teamId
다음과 같은 SQL이 실행됩니다.
select * from Member m where m.teamId = :teamId
teamId가 Member에 있기 때문에 Team과 조인이 없이 teamId를 Member에서 바로 찾을 수 있습니다.
스프링 데이터 JPA는 이런 경우 최적화를 하지 못하고 Team과 조인을 하는데요. 한계라기 보다는 스프링 데이터 JPA가 메서드 이름을 그대로 JPQL에 반영하는 방식으로 작동하기 때문으로 추정됩니다.
감사합니다.
0
알려주시셔서 감사합니다.
추가적으로 궁금한게 findByTeamId(Long id), findByTeam_id(Long id)으로 사용 시 (fetch = FetchType.LAZY)가 적용된 컬럼이여도 해당 방식으로 조회 시 join이 강제로 발생한다는 의미가 맞나요??
0
추가로 연관관계가 있을 때 id로 조회하는 것과 엔티티로 조회하는 것 관련해서 기본편 강의
섹션 11. 객체지향 쿼리 언어 - 중급 문법 -> 엔티티 직접 사용을 들어보시면 궁금해 하시는 내용을 자세히 설명해드립니다^^
감사합니다.






오래됐지만 여전히 빛나는 답글에 질문을 드려봅니다.
혹시 어떤 한계 때문에 강제로 join이 발생하는지 알 수 있을까요?