querydsl 기본설정은 저번에 포스팅한적이 있어서 생략하겠다.
쿼리메서드나 @Query 등으로 처리할수 없는 기능은 별도의 인터페이스로 설계
위에서 언급한 인터페이스에 대한 구현 클래스를 작성한다. 이떄 QuerydslRepositorySupport라는 클래스를 부모 클래스로 사용
구현 클래스에 인터페이스의 기능을 Q도메인 클래스와 JPQLQuery를 이용해서 구현
QuerydslRepositorySupport 클래스는 Querydsl라이브러리를 이용해서 직접 무언가를 구현할떄 사용한다.
인터페이스를 구현하는 클래스를 만들어주고 QueryRepositorySupport 를 상속한다는것도 잊지말자.
QueryRepositorySupport는 생성자가 존재하므로 super()를 이용해서 호출해야한다.
querydsl 처럼 q도메인을 생성해준다. 쿼리작성 코드가 좀 생소할지 몰라도 자세히 보다보면 어느정도 감이 온다.
select() 내에 여러 객체를 가져오는 형태로 변경되었다. 이렇게 정해진 엔티티 객체 단위가아니라 각각의 데이터를 추출하는 경우에 Tuple라는 객체를 이용한다.
결과는 List에 담아준다.
※ 정리를 해보면 앞에서는 @Query로 테이블을 불러왔지만 여기서는 JPQLQuery로 테이블을 불러와 적용을 해보았다. 두 녀석의 차이점은 JPQLQuery는 좀 더 디테일한 세부정보만 모아서 추출이 가능하다는 점이다.
pageable의 Sory객체는 JPQL의 orderBy의 파라미터로 전달되어야 하지만 JPQL에서는 Sort객체를 지원하지 않기 떄문에 orderBy()의 경우 OrderSpecifier<T extends Comparable,> 울 파라미터로 처리해야한다.
OrderSpecifier에는 정렬이 필요하므로 Sort객체의 정렬 관련 정보를 com.querydsl.core.types.Order 타입으로 처리하고 Sort 객체에 속성(bno,title)등은 PathBuilder라는 것을 이용해 처리한다.
fetchCount() 를 이용해 count 쿼리도 같이 처리 가능하다.
searchPage()의 리턴 타입은 Page<Object[]> 이므로 메서드의 내부에서 Page타입의 객체를 생성해야한다.
page는 인터페이스타입이므로 PageImpl클래스를 이용해서 생성한다.
PageImpl 클래스의 생성자에는 Pageable과 long값을 이용하는 생성자가 존재한다.