스프링 데이터 JPA에서는 save,update,delete,find...ByXXX 같은 메서드는 사용이 가능 하지만,
search() 같은 메서드는 호출할 수 없다
이럴 때는 사용자 정의 리포지토리를 이용한다
방법은 다음과 같다
먼저 MemberRepositoryCustom 인터페이스를 생성한 후 사용하고자 하는 메서드를 입력한 후
public interface MemberRepositoryCustom {
List<MemberTeamDto> search(MemberSearchCondition condition);
}
MemberRepositoryCustom를 MemberRepositoryCustomImpl에서 구현한다
public class MemberRepositoryImpl implements MemberRepositoryCustom {
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
//회원명, 팀명, 나이(ageGoe, ageLoe)
public List<MemberTeamDto> search(MemberSearchCondition condition) {
return queryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name))
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()))
.fetch();
private BooleanExpression usernameEq(String username) {
return isEmpty(username) ? null : member.username.eq(username);
}
private BooleanExpression teamNameEq(String teamName) {
return isEmpty(teamName) ? null : team.name.eq(teamName);
}
private BooleanExpression ageGoe(Integer ageGoe) {
return ageGoe == null ? null : member.age.goe(ageGoe);
}
private BooleanExpression ageLoe(Integer ageLoe) {
return ageLoe == null ? null : member.age.loe(ageLoe);
}
}
MemberRepository에서 MemberRepositoryCustom을 extends 한다
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom
'QueryDSL' 카테고리의 다른 글
[Querydsl] 스프링 데이터 페이징(전체 카운트 따로 조회하기) (0) | 2022.03.25 |
---|---|
[Querydsl] 동적쿼리 처리하는 방법(BooleanBuilder, Where 다중 파라미터 사용) (0) | 2022.03.25 |
[Querydsl] @QueryProjection (0) | 2022.03.25 |
[Querydsl] 프로젝션(Projection) (0) | 2022.03.25 |
[Querydsl] 서브쿼리 (from절 서브쿼리 한계) (0) | 2022.03.23 |