이번 장에서 Querydsl을 이용한 JPQL 작성방법을 상세하게 살펴보겠습니다.
4.1. 테스트 프로젝트 만들기
"부록 7.1 Querydsl JPA Query with MySQL" 부분을 참고하여 진행합니다.
application.properties
환경설정 파일에서 다음처럼 변경합니다.
4.2. JPA Query 학습
4.2.1. Select
Q 타입 클래스를 사용하여 메소드 기반으로 쿼리를 작성할 수 있습니다.
1. 기본 사용법
DeptDao.java
질의 결과가 하나의 로우라면 fetchOne 메소드를 사용합니다. 얻고자 하는 결과의 자료형에 따라 메소드를 선택합니다.
fetchOne 메소드는 결과가 하나 이상이면 TooManyRowsException 예외가 발생합니다. fetchFirst 메소드는 TooManyRowsException 예외가 발생하지 않고 데이터가 있다면 첫 번째 로우를 리턴합니다. 둘 다 데이터가 없으면 null을 리턴합니다.
DeptDaoTest.java
SQL 로그
콘솔창에 기록된 SQL쿼리를 살펴보겠습니다.
결과 로그에서 앨리어스를 'dept0_'에서 'd'로 바꾸어 보기 편하게 수정했습니다.
2. 1차 캐싱
1차 캐싱 서비스를 제공받는지 테스트해 보겠습니다.
DeptDaoTest.java
클래스에 testEntityManagerCaching 메소드를 직접 추가합니다.
EntityManager는 PersistenceContext로 데이터베이스로부터 질의하여 얻은 결과를 담고 있는 엔티티 객체를 보관합니다. 다음에 같은 결과를 요구하는 요청을 받으면 갖고 있는 엔티티 객체를 돌려준다는 것을 확인 할 수 있습니다. 이는 같은 트랜잭션 범위 안에서만 유효합니다.
JPAQuery, JPAQueryFactory 클래스를 이용하면 엔티티매니저가 제공하는 메소드를 직접 이용할 때와 마찬가지로 동일한 기능을 이용할 수 있습니다.
3. 필터 설정방법
DeptDao.java
DeptDaoTest.java
SQL 로그
where 조건절에 서브쿼리를 사용하여 부서에 배정된 직원이 있는 부서명만 조회합니다. 이 요청을 dept.emps.size().gt(0) 코드처럼 객체를 이용하는 방식 그대로 처리할 수 있습니다.
위 SQL을 exists 구문을 사용하는 것으로 바꾸면 다음과 같습니다.
위 SQL을 사용하도록 요청하는 메소드 기반 쿼리 작성예시는 다음과 같습니다.
}
댓글 없음:
댓글 쓰기