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 |