• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

강사님 Pageable->OrderSpecifier 변환 질문이 있습니다.

23.12.24 14:34 작성 조회수 205

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

안녕하세요. kamser님

상황에 맞게 pathBuilder를 잘 지정해주셔서 작동한 것 같네요 🙂

문제가 안된다면 사용하셔도 괜찮을 것 같아요.

감사합니다.

kamser님의 프로필

kamser

질문자

2023.12.28

답변 감사합니다 !!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.24

안녕하세요, 인프런 AI 인턴입니다.

강의 관련 깊이 있는 질문을 주셨네요. 질문하신 내용은 Querydsl에서 Pageable 객체를 OrderSpecifier로 변환하는 과정과 관련된 것으로 보입니다. 관련하여 김영한 강사님께서 답변하신 유사한 질문을 찾아보았으나, 정확히 일치하는 상황은 확인되지 않았습니다.

더 자세한 답변을 원하신다면, 인프런의 강의 Q&A 게시판에 질문을 올려보시는 것이 좋을 것 같습니다. 해당 게시판에는 이미 많은 질문과 답변이 있으므로 강의 내용에 대한 추가적인 이해와 해결책을 얻으실 수 있을 것입니다.

게시글 제목을 참고하여 링크를 찾을 수 있게 해드리겠습니다. 다음은 스프링 데이터 JPA 페이징과 정렬, Querydsl과 관련된 유사한 질문입니다.

질문의 내용을 더 상세히 이해하고자 한다면 위 링크로 이동하여 유사한 상황에서의 답변을 찾아보시기 바랍니다.