public interface ExamRepository extends JpaRepository<Entity, Long>
@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>
@NoRepositoryBean
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID>
@NoRepositoryBean
public interface ListPagingAndSortingRepository<T, ID> extends PagingAndSortingRepository<T, ID>
public interface QueryByExampleExecutor<T>
그 이유는 @Configuration을 사용한 빈 설정 클래스에서 @EnableJpaRepositories 을 사용하기 때문입니다.
Jpa는 @EnableJpaRepositories annotation을 사용해서 JpaRepository를 활성화 해준다. 이 기능은 spring boot에서 자동으로 설정 되어 있다고 한다.
해당 어노테이션을 따라가면 아래와 같이 정의되어 있는데 자세 희 보면 중간 에
JpaRepositoriesRegistrar.class 를 임포트하고 있는데 한번 더 따라가면
이는 JpaRepository들을 bean으로 등록하는 역할을 한다는 것을 알수 있다.
@NoRepositoryBean
public interface JpaDynamicRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
}
public class JpaDynamicRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements JpaDynamicRepository<T, ID> {
}
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableJpaRepositories(repositoryBaseClass = JpaDynamicRepositoryImpl.class)
public class examApplication extends SpringBootServletInitializer {
}
@EnableJpaRepositories(repositoryBaseClass = JpaDynamicRepositoryImpl.class) 으로 커스텀 레포지토리 구현체를 자동으로 빈으로 등록 할 수 있게하고 , JpaDynamicRepository 인터페이스가 빈으로 등록되지 않도록 @NoRepositoryBean 어노테이션을 달아 빈을 생성하지 못하도록 하는데 적용하였습니다.
@SpringBootApplication
public class QueryDsl3Application {
public static void main(String[] args) {
SpringApplication.run(QueryDsl3Application.class, args);
}
}
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
List<Member> findByUsername(String username);
}
public interface MemberRepositoryCustom {
List<MemberTeamDto> search(MemberSearchCond condition);
Page<MemberTeamDto> searchPageSimple(MemberSearchCond condition, Pageable pageable);
Page<MemberTeamDto> searchPageComplex(MemberSearchCond condition, Pageable pageable);
}
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
//-------사용자정의 레포지토리 --------- queryDsl -----------
private final JPAQueryFactory jpaQueryFactory;
public MemberRepositoryCustomImpl(EntityManager em) {
this.jpaQueryFactory = new JPAQueryFactory(em);
}
//회원명, 팀명, 나이(ageGoe, ageLoe)
@Override
public List<MemberTeamDto> search(MemberSearchCond condition) {
return jpaQueryFactory
.select(Projections.constructor(MemberTeamDto.class,
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();
}
.......
}