728x90
반응형
SMALL
스프링 데이터 JPA에서 Querydsl을 지원하는 QuerydslRepositorySupport 라는 추상 클래스가 있다. 어떤걸 도와주냐면 우리가 이전에 사용했던 Querydsl 용 리포지토리를 아래와 같이 변경해보자.
public class MemberRepositoryImpl extends QuerydslRepositorySupport implements MemberRepositoryQueryDsl {
// private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(Class<?> domainClass) {
super(Member.class);
}
...
}
- 기존에는, extends QuerydslRepositorySupport 가 없었는데 이 부분을 추가했다.
- 그리고, JPAQueryFactory를 주입 받아야 하는 부분도 제거했다. 대신 저 QuerydslRepositorySupport를 상속받으면 반드시 생성자를 만들어 줘야 하는데 그 부분이 바로 이 부분이다.
public MemberRepositoryImpl(Class<?> domainClass) {
super(Member.class);
}
이렇게 해주면 아래와 같은 장점이 있다.
- JPAQueryFactory를 주입받지 않아도 된다.
- from()으로 시작하는 쿼리를 작성할 수 있다. (이게 장점인지는 모르겠다)
- getQuerydsl().applyPagination() 이라는 스프링 데이터가 제공하는 페이징을 Querydsl로 편리하게 반환이 가능한데 사실 이것도 편리한지는 잘 모르겠다. 심지어 Sort도 제대로 동작안한다.
@Override
public List<MemberTeamDto> search(MemberSearchCondition condition) {
return from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
).select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")))
.fetch();
/*return queryFactory
.select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")))
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
).fetch();*/
}
- 주석 처리한 부분이 기존에 작성했던 코드이다.
- 보면, from()으로 시작하는데, select()가 뒤에 있고 뭔가 좀 어색하고 쿼리를 한번에 읽기엔 명시적이지 않다. 난 이걸 장점으로 생각하지는 않는다.
@Override
public Page<MemberTeamDto> searchPaging(MemberSearchCondition condition, Pageable pageable) {
JPQLQuery<MemberTeamDto> jpaQuery = from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
).select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")));
JPQLQuery<MemberTeamDto> query = getQuerydsl().applyPagination(pageable, jpaQuery);
query.fetch();
/*List<MemberTeamDto> result = queryFactory
.select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")))
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
JPAQuery<Member> countQuery = queryFactory
.select(member)
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())); */
return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.stream().count());
}
- 이게 이제 페이징을 좀 편리하게 해준다는 getQuerydsl().applyPagination()을 사용한 방법인데, 기존에 작성했던 코드랑 차이점은 쿼리에 offset(), limit()을 작성하지 않는다는 점이다.
- 근데, 이거 하나 줄이겠다고 저렇게 from()부터 시작하는 게 영 맘에 들지는 않는다.
728x90
반응형
LIST
'Querydsl' 카테고리의 다른 글
JPA 레포지토리와 Querydsl (2) | 2024.12.26 |
---|---|
Querydsl 중급 문법 (0) | 2024.12.22 |
Querydsl 기본 문법 (0) | 2024.12.21 |
[Renewal] QueryDsl (0) | 2024.12.07 |
Spring Boot 3.1.5에서 QueryDSL 설치하기 (0) | 2023.11.26 |