양방향 관계에서는 @JsonIgnore 붙여줘야 무한루프에 걸리지 않고 데이터를 가져올 수 있다.
앤티티는 DTO로 변환해서 활용해야한다.
@xtoOne(다대일,일대일) fetch join 사용해 연관된 데이터들을 가져온다.
일대다는 fetch join하면 페이징 불가
->batchsize 증가해
public List<Order> findAllWithMemberDelivery(int offset, int limit) {
return em.createQuery(
"select o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d", Order.class)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
}
x대일 관계의 데이터로만 묶어 데이터 뻥튀기 되지 않는 선에서 가져옴
public OrderDto(Order order) {
orderId = order.getId();
name = order.getMember().getName();
orderDate = order.getOrderDate();
address = order.getDelivery().getAddress();
orderItems = order.getOrderItems().stream()
.map(orderItem -> new OrderItemDto(orderItem))
.collect(Collectors.toList());
}
이후는 for문으로 가져옴(LAZY로딩이기 때문에 하나씩 가져와 줘야한다.)
spring:
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
show_sql: true
format_sql: true
default_batch_fetch_size: 100
근데 쿼리가 n개씩 나가는 것은 비효율적이기에 배치 사이즈를 설정해 한 번에 여러개를 가져오도록 한다.