본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/QueryDSL

Spring boot -QueryDSL 과 JPQL 차이점

반응형

제목엔 차이점이라 적혀있지만 결국 QueryDsl은 JPQL bulider 역할을 한다. (결국엔 jpql로 변환된다)

 

 

샘플데이터 팀A.B와  멤버 1234가 persist 되었다 

Test 코드에서 @BeforeEach를 사용하면

각 단위별 테스트가 실행되기 전에  @BeforeEach가 붙은 메서드를 먼저 실행한다.

 

이름이 memberA 인 회원을 JPQL과 queryDsl 로 찾아보았다

 

1. JPQL

createQuery로 jpql을 생성하고 username을 파라미터 바인딩하였다

 

2.QueryDSL

 

JPAQueryFactory생성 파라미터로 Entitymanager가 필요하다.

 

QueryDSL로 만든 메서드

 

QueryDSL은 queryFactory와 Q-TYPE 객체를 사용하여 쿼리를 생성한다. 

queryFactory는 엔티티매니저를 파라미터로 받아야 하고 

멀티쓰레드에 맞게 설계가 되어있어 필드레벨로 빼서 사용해도 상관없다.

 

쿼리 생성전 Q타입 객체를 받아와야 한다.

Q타입객체을 생성할 때는  위와같이 직접 Q객체를 생성하고 파라미터로 별칭을 따로주거나

아래 코드처럼 지정되있는 별칭을 가져와 사용할 수있다.

QMember qMember = QMember.member ;

 

quertFactory에 .을 찍어보면 스트링에 맞는 메서드가 나온다 (select,from,where ....)

where 절에서는 바인딩을 따로 명시하지 않아도 자동으로 파라미터가 바인딩 된다 .

쿼리생성을 자바 객체로하기 떄문에 컴파일 단계에서 오류를 잡을 수 있는 것이 큰 장점이다.

위와 같이 체인으로 쿼리를 만들고  결과가 하나일경우 fetchOne 여러개일경우 fetch로 끝내주면 쿼리가 완성된다.  

 

반응형