작성
·
478
·
수정됨
0
안녕하세요 ,
원래 작성했던 코드에서 querydsl 로 변경하는 중 사용이 익숙하지 않아 질문 드립니다.
아래는 원래 작성했던 코드입니다.
@Override
public Page<MemberDto> findAllMember(int pageNumber, int size) {
Pageable pageable = PageRequest.of(pageNumber, size);
List<MemberDto> MemberDtoList = memberRepository.findAllByState(MemberCode.S1)
.get()
.stream()
.sorted(Comparator.comparingLong(o -> (o.getCapacity() - o.getCnt())))
.map(MemberDto::fromEntity)
.collect(Collectors.toList());
위 코드에서 https://www.inflearn.com/questions/94176/querydsl-sorting-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4 이 질문을 참고해 아래와 같이 작성해 보았습니다.
public Page<Member> findAllByState (MemberCode memberCode, Pageable pageable) {
return applyPagination(pageable, queryFactory -> queryFactory
.selectFrom(member)
.where( member.state.eq(memberCode.S1))
.orderBy(member.capacity.subtract(member.cnt).asc())
);
}
하지만 제가 원했던 바와 다르게 생성 순으로 반환되고 있어 필드끼리 계산을 이용해 orderBy 하는 방법을 알고 싶습니다.
참고로 orderBy 안 member.capacity.subtract(member.cnt) 는 member 클래스의 가능한 총 정원에서 실제member 의 수 만큼 제외한 것이며 , Long 타입입니다.
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. querydsl을 사용하면서 orderBy를 적용하는 방법에 대해 궁금하신 것 같아요.
먼저, 원래 작성하신 코드에서는 스트림을 이용하여 정렬하고 있으시네요. 그러나 querydsl을 사용하면 정렬도 직접 설정할 수 있어요. orderBy 메서드를 사용해서 원하는 정렬 조건을 추가해보세요.
아래는 orderBy를 적용한 코드 예시입니다.
public Page<MemberDto> findAllMember(int pageNumber, int size) {
Pageable pageable = PageRequest.of(pageNumber, size);
QMember qMember = QMember.member; // querydsl Q타입 선언
JPQLQuery<MemberDto> query = queryFactory
.select(Projections.constructor(MemberDto.class, ...)) // 원하는 필드 선택
.from(qMember)
.where(qMember.state.eq(MemberCode.S1))
.orderBy(qMember.capacity.subtract(qMember.cnt).asc()); // 필드 간 계산을 이용한 정렬
List<MemberDto> memberDtoList = query
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
long totalCount = query.fetchCount();
return new PageImpl<>(memberDtoList, pageable, totalCount);
}
위 코드에서 필요한 부분은 별표(*) 처리한 부분인데요, 원하시는 필드를 선택해서 MemberDto 생성자에 전달해주세요. 그리고 Q타입을 사용해서 원하는 필드를 orderBy에 추가하면 됩니다. 마지막으로 offset과 limit을 적용하여 페이징 처리를 해주면 됩니다.
이렇게 수정하시면 기존에 원했던 정렬 조건을 querydsl로 적용할 수 있을 거에요. 추가적인 질문이 있으시면 언제든지 물어보세요!