스프링 데이터 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

 

+ Recent posts