해결된 질문
작성
·
462
1
강의는 스프링 데이터 페이징 활용 3 - 컨트롤러 개발
시간은 6:33
코드는
for (Sort.Order o : pageable.getSort()) {
PathBuilder pathBuilder = new PathBuilder(member.getType(), member.getMetadata());
query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,pathBuilder.get(o.getProperty())));
List<MemberTeamDto> content = query.fetch();
}
루트 엔티티가 현재는 member 입니다.
직접 테스트해보고 싶어서 임의의 엔티티 user를 만들고 left join으로 묶었습니다
@Override
public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition,
Pageable pageable) {
JPAQuery<MemberTeamDto> query = factory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name,
user.name))
.from(member)
.leftJoin(member.team, team)
.leftJoin(user).on(team.id.eq(user.id))
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()))
.offset(pageable.getOffset())
.limit(pageable.getPageSize());
JPAQuery<Long> countQuery = factory
.select(member.count())
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()));
for (Sort.Order order : pageable.getSort()) {
PathBuilder pathBuilder;
if (order.getProperty().equals("name")) {
pathBuilder = new PathBuilder<>(user.getType(), user.getMetadata());
} else {
pathBuilder = new PathBuilder<>(member.getType(), member.getMetadata());
}
query.orderBy(new OrderSpecifier(order.isAscending()? Order.ASC:Order.DESC,pathBuilder.get(order.getProperty())));
}
List<MemberTeamDto> content = query.fetch();
return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
}
left join user를 추가하고 조건은 user.id = team.id 로 했습니다.
http://localhost:8080/v2/members?page=0&size=3&sort=name,asc&sort=username,asc
실행되는 SQL은
select
m1_0.member_id,
m1_0.username,
m1_0.age,
m1_0.team_id,
t1_0.name,
u1_0.name
from member m1_0
left join team t1_0 on t1_0.team_id=m1_0.team_id
left join users u1_0 on m1_0.team_id=u1_0.id
order by
u1_0.name,
m1_0.username
limit 0,3;
단순한 경우에는 상관이 없지만 조인하는 경우에는 동작을 잘 안한다고 설명을 해주셔서
간단하게 테스트를 해봤는데 동작을 하더라구요
강의 이후에 오류가 수정되어 해결이 된건지 아니면 제가 테스트를 잘못한걸까요?
아니면 강사님께서 말씀하신 경우가 이 경우가 아닌 걸까요 ?
답변 2
2
0
안녕하세요, 인프런 AI 인턴입니다.
강의 관련 깊이 있는 질문을 주셨네요. 질문하신 내용은 Querydsl에서 Pageable 객체를 OrderSpecifier로 변환하는 과정과 관련된 것으로 보입니다. 관련하여 김영한 강사님께서 답변하신 유사한 질문을 찾아보았으나, 정확히 일치하는 상황은 확인되지 않았습니다.
더 자세한 답변을 원하신다면, 인프런의 강의 Q&A 게시판에 질문을 올려보시는 것이 좋을 것 같습니다. 해당 게시판에는 이미 많은 질문과 답변이 있으므로 강의 내용에 대한 추가적인 이해와 해결책을 얻으실 수 있을 것입니다.
게시글 제목을 참고하여 링크를 찾을 수 있게 해드리겠습니다. 다음은 스프링 데이터 JPA 페이징과 정렬, Querydsl과 관련된 유사한 질문입니다.
질문의 내용을 더 상세히 이해하고자 한다면 위 링크로 이동하여 유사한 상황에서의 답변을 찾아보시기 바랍니다.
답변 감사합니다 !!