-
[SpringBoot] 쿼리 DSL 동적 조건문 생성SpringBoot Meteor 2021. 12. 17. 09:50
- 우선 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; } }
'SpringBoot Meteor' 카테고리의 다른 글
[Spring Boot] Spring Security 시큐리티 권한 업데이트 시 동적 적용 (0) 2021.12.21 [Spring Boot] 쿼리 DSL을 이용한 서브쿼리 (0) 2021.12.17 [SpringBoot]Content-Security-Policy(resorces request https) (0) 2021.11.10 [SpringBoot] 인스타그램 API를 이용해 인스타 Feed 데이터 들고오기2 (0) 2021.10.22 [SpringBoot] 인스타그램 API를 이용해 인스타 Feed 데이터 들고오기 (0) 2021.10.21