[JPA] getReferenceById

공부는 혼자하는 거·2023년 6월 5일
0

Spring Tip

목록 보기
41/52

예를 들어 연관관계에 있는 엔티티를 검색조건으로 활용하는 쿼리가(QueryDsl) 있다.


  override fun findOrderItemsByOrder(orderParam: Order): MutableList<OrderItem> {

        return queryFactory
            .selectFrom(orderItem)
            .from(orderItem)
            .join(orderItem.userMastering, userMastering).fetchJoin()
            .join(orderItem.order, order).fetchJoin()
            .leftJoin(orderHistory).on(orderHistory.order.eq(order))
            .where(
                orderItem.order.eq(orderParam)
            )
            .fetch()
    }

실제로 DB에는 외래키 ID 값만 가지고 조회를 할 수 있다. 나는 Order를 검색하는 쓸데없는 쿼리를 하나 더 날리고 싶지 않다. 그래서 기존에는 Id 값만 가지는 더미 Order 객체를 만드는 정적 팩토리 메서드를 사용해서 더미 객체를 넘겨주는 식으로 하였으나. JPA에는 이미 위와 같은 인터페이스가 정의되어있다.

내부의 값을 필요로 하지는 않고, 다른 객체에게 할당하는 목적으로만 조회하는 경우, getReferenceById 를 사용하면 된다. 실제로도 쿼리 한 번만 나간다.

    @Transactional(readOnly = true)
    fun findOrderItemsById(orderId: Long){

        val order =
            orderRepository.getReferenceById(orderId)

        orderRepository.findOrderItemsByOrder(order)

    }

참고

https://creampuffy.tistory.com/162

https://stackoverflow.com/questions/27930449/jpa-many-to-one-relation-need-to-save-only-id

profile
시간대비효율

0개의 댓글