ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot] 쿼리 DSL 동적 조건문 생성
    SpringBoot Meteor 2021. 12. 17. 09:50
    1. 우선 QueryDSL에 구현하고자 하는 메서드를 정의해준다
    public interface MemberQueryDSLRepository {
        Page<AdminMemberListDTO> getAdminMemberListDTOPage(Pageable pageable, String category, String searchType, String searchValue);
    }
    

    RepositoryImpl 에서 구현을 해준다.

    @RequiredArgsConstructor
    public class MemberRepositoryImpl implements MemberQueryDSLRepository{
        private final JPAQueryFactory query;
    
    	//QEntity.entity로 사용 해야함
        @Override
        public Page<AdminMemberListDTO> getAdminMemberListDTOPage(Pageable pageable, String category, String searchType, String searchValue) {
    
            JPAQuery<AdminMemberListDTO> adminMemberListDTOJPAQuery = query
                    .select(Projections.constructor(AdminMemberListDTO.class, // Projections.constructor 는 엔티티와 다른 반환 타입인 경우 Projections 를 사용
                            memberEntity.idx,
                            memberEntity.nickname,
                            memberEntity.phoneNumber,
                            memberEntity.email,
                            memberEntity.gender
                            ))
                    .from(memberEntity)
                    .where(eqSearch(category, searchType, searchValue));
    
            // fetchCount : 쿼리를 돌려서 나온 데이터의 개수
            // fetch : List 데이터
            // fetchOne : 단일 데이터
            long totalCount = adminMemberListDTOJPAQuery.fetchCount();
    
    				// 페이징 범위를 설정 해준다.
            adminMemberListDTOJPAQuery.offset(pageable.getOffset()).limit(pageable.getPageSize());
    
            // pageable 안에 있는 정렬조건이 여러개 있을 수 있다.
    			  // 정렬 조건 추가 코드
            for (Sort.Order o : pageable.getSort()) {
                PathBuilder<MemberEntity> pathBuilder = new PathBuilder<>(memberEntity.getType(), memberEntity.getMetadata());
                adminMemberListDTOJPAQuery.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC, pathBuilder.get(o.getProperty())));
            }
    
            List<AdminMemberListDTO> adminMemberListDTOList = adminMemberListDTOJPAQuery.fetch();
    
            return new PageImpl<>(adminMemberListDTOList, pageable, totalCount);
        }
    
        // 쿼리문에 동적 조건을 만들어 주는 역할입니다.
        // BooleanExpression 대신 BooleanBuilder 를 사용하면 함수형 프로그래밍 가능
        // BooleanExpression 을 사용해도 된다 하지만 BooleanExpression 사용 시 최소한 하나의 조건을 사용해야하기 때문에 조건이 없을 시 에는 따로 예외처리를 해줘야한다.
        private BooleanBuilder eqSearch(String category, String searchType, String searchValue) {
            BooleanBuilder n = new BooleanBuilder();
            if ("M".equals(category) || "W".equals(category)) {
                n.and(memberEntity.gender.eq(category));
            }
            if (!"".equals(searchValue)) {
                if ("nickname".equals(searchType)) {
                    n.and(memberEntity.nickname.contains(searchValue));
                } else if ("phoneNumber".equals(searchType)) {
                    n.and(memberEntity.phoneNumber.contains(searchValue));
                } else if ("email".equals(searchType)) {
    //                StringExpression se = Expressions.stringTemplate("replace({0},' ','')", memberEntity.email);
    //                n.and(se.contains(searchValue.replace(" ", "")));
                    n.and(memberEntity.email.contains(searchValue));
                }
            }
            return n;
        }
    
    }
    
Designed by Tistory.