Persistence Framework/ORM -JPA

QueryDsl, 사용자 정의 Repository

prden 2022. 10. 11. 21:09

1. Spring Data JPA 리포지토리

ex) interface를 만든다.

//User entity와 userId 들어가서Long
public interface UserRepository extends JpaRepository<User, Long> {

    @EntityGraph(attributePaths = "authorities")
    Optional<User> findOneWithAuthoritiesByUsername(String username);
}

 

2. Spring Data JPA 사용자 정의 Repository

순서 :

가. 사용자 정의 인터페이스 작성 ->

나. 사용자 정의 인터페이스 구현 ->

다. 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속

1) 기존 MemberRepository(JpaRepository상속)의 경우 

 *
 * 뒤에 MemberRepositoryCustom 이거 이렇게 해주면 된다.
 * 구현체는 MemberRepositoryImpl로
 * 이 인터페이스에 +Impl만 하고!!
 */
 
public interface MemberRepository extends JpaRepository<Member,Long>, MemberRepositoryCustom {
    //findById, findAll..등은 기본으로 들어가있고
    
    //username으로 쿼리 만들어줌(username은 필드에 동일한 이름 있어야 된다.)
    List<Member> findByUsername(String username);
}

 

2) MemberRepositoryCustom 인터페이스를 만든 뒤

-> MemberRepositoryImpl(여기 명명규칙 주의, JpaRepository 상속받은 MemberRepository에 Impl을 뒤에 붙여야 한다. 

그리고 MemberRepository에서는 JpaRepository 뒤에 MemberRepositoryCustom 붙이기!!

 // List<MemberTeamDto> search(MemberSerarchCondition condition); 커스텀하게 이런 쿼리 만들 때
 
public interface MemberRepositoryCustom {
    List<MemberTeamDto> search(MemberSerarchCondition condition);
}

 

3) MemberRepositoryImpl에 @Override해서 여기 쿼리짜면 된다. 

//여기 주의 MemberRepository라는 jpa상속받고 있는 이름 바로 뒤에 Impl써야 된다.


public class MemberRepositoryImpl implements MemberRepositoryCustom {

	private JPAQueryFactory query;

    public MemberRepositoryImpl(EntityManager em) {
        this.query = new JPAQueryFactory(em);
    }
    
    @Override
    public List<MemberTeamDto> search(MemberSerarchCondition condition) {
    
    //여기서 쿼리 작성
    
        return null;
    }
}

 

4) 1,2,3 위에랑 다르게 , 독자적으로 특정 화면에 특화된 쿼리일 때는

  클래스 만들고 @Repository 빈으로 만들어서 바로 인젝션 해서 써주기 

@Repository
public class JpaMyOrderDaoImpl implements MyOrderDao {
    private JPAQueryFactory query;

    public JpaMyOrderDaoImpl(EntityManager em) {
        this.query = new JPAQueryFactory(em);
    }

    @Override
    public Page<Order> getMyOrders(Long ordererId, Pageable pageable) {
        QueryResults<Order> searchOrderByOrdererId = query.select(order)
                .from(order)
                .join(order.account, account).fetchJoin()
                .where(order.account.accountId.eq(ordererId))
                .offset(pageable.getOffset())
                .limit(pageable.getPageSize())
                .orderBy(order.orderId.desc())
                .fetchResults();

        List<Order> contents = searchOrderByOrdererId.getResults();
        long total = searchOrderByOrdererId.getTotal();

        return new PageImpl<>(contents, pageable, total);
    }

    @Override
    public Optional<Order> getMyOrderDetails(Long orderId) {
        Order order = query.select(QOrder.order)
                .from(QOrder.order)
                .join(QOrder.order.account).fetchJoin()
                .where(QOrder.order.orderId.eq(orderId))
                .fetchOne();
        return Optional.of(order);
    }
}

 

'Persistence Framework > ORM -JPA' 카테고리의 다른 글

JPA Insert vs. Update  (0) 2023.01.20
Spring Data JPA Pagination, Querydsl의 pagenation연결  (0) 2022.10.11
QueryDsl 설정  (0) 2022.10.05
N+1문제  (0) 2021.08.30
영속성 전이 : CASCADE 와 고아객체  (0) 2021.08.29