JPQL(3)
-
JPQL: fetch join - 페치 조인, N+1의 문제
들어가기 앞서서 페이조인은.. • SQL 조인 종류가 아니다 • JPQL에서 성능 최적화를 위해 제공하는 기능이다. • 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다 • join fetch 명령어로 사용하면 된다 • [ LEFT [OUTER] | INNER ] JOIN FETCH 조인 경로를 지정할 수 있다. 그럼 시작~! 다음과 같은 상황이 있다고 가정하다. 회원과 팀 엔티티가 있는 상황에서, 회원을 조회하면서 연관된 팀도 함께 조회하고 싶다. 회원도 궁금하고 그들의 소속 팀도 함께 보고싶다!!!! 이때 사용하는 것이 페치 조인이다. select m from Member m join fetch m.team select 프로젝션에 m 하나인데, 실제 SQL은 select M.* T.* ..
2022.04.04 -
JPQL 파라미터 바인딩, 프로젝션
JPQL은 파라미터 바인딩을 두가지 방법으로 할 수 있음 1) 이름 기준 -- 권장 2) 위치 기준 -- 권장X 이름 기준 SELECT m FROM Member m where m.username=:username query.setParameter("username", usernameParam); 위치 기준 SELECT m FROM Member m where m.username=?1 query.setParameter(1, usernameParam) 위치 기준이 권장되지 않는 이유는, 카운팅 중간에 다른 쿼리가 들어와야 하는 경우, 그 숫자부터 줄줄이 밀려 전부 변경해야 한다. 가급적이면 이름 기준으로 파라미터를 바인딩 하자. 프로젝션 : SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상: 엔티티,..
2022.03.28 -
JPQL 기본 문법
JPA는 다양한 쿼리 방법을 지원한다. JPA Criteria, QueryDSL, 네이티브 SQL, Mybatis 등 다 같이 사용할 수 있다. 단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요하다. 영속성 컨텍스트에서 DB로 commit이나, 중간에 flush() 호출이 없으면 DB에는 아직 반영이 안되어있는 상태이기 때문이다. JPQL은 쿼리를 날리기 전에 flush가 동작한다. 이후 쿼리가 실행된다. JPQL은 강제로 수동 flush()를 해줄 필요가 없다. 가장 기본이 되는 방법은 JPQL인데, 이거 잘하면 QueryDSL도 뚝딱이라고 한다. 얼른 쿼리문 짱고수 되고싶다.. 먼저, JPA를 사용하면 엔티티 객체를 중심으로 개발해야 한다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로..
2022.03.28