일대다 페이징

JPA에서 일대다 관계를 실행하고 조인 가져오기를 수행하면 데이터가 메모리에 로드되고 있음을 나타내는 WARN 메시지가 콘솔 창에 표시됩니다.

일대다라면 데이터가 부풀려지면서 페이징 프로세스가 이상해질 수밖에 없기 때문에 그런 선택을 한 것 같다.

그래서

jpa:
  hibernate:
    ddl-auto: create
  properties:
    hibernate:
      format_sql: true
      default_batch_fetch_size: 100

default_batch_fetch_size: 100으로 설정합니다.
이 방법으로 모든 “많은” 자식을 한 번에 가져오고 나갑니다.

선택하다
orderitem0_.order_id를 col_0_0_으로,
item1_.name을 col_1_0_으로,
orderitem0_.order_price as col_2_0_,
orderitem0_.count as col_3_0_
에서
bestell_artikel 베스텔라티켈0_
내부 연결
기사 기사1_
주문 item0_.item_id=item1_.item_id
어디
orderitem0_.order_id(
? , ?
)

이런 식으로 데이터를 in 절에 즉시 삽입합니다.
(원래 데이터 개수당 하나의 쿼리(중복 쿼리가 없다고 가정))

따라서 1000개의 데이터가 있으면 100번 100번 루프하고 모든 데이터를 인 쿼리로 로드하므로 일대다 관계도 페이지를 매길 수 있습니다.
물론 다대일 또는 일대일 관계는 중복 데이터를 생성하지 않기 때문에 여러 면이 가능합니다.

여하튼 이 방법으로 페이징을 처리할 수는 있지만 한 번에 100개 항목을 가져오면 DB 성능 문제가 발생할 수 있으므로 50개 항목을 지정할 수 있습니다.
이건 써봐야 알 것 같아요.

그리고 Join Fetch를 사용하여 많은 데이터를 로드하는 경우 한 번에 모두 로드되기 때문에 성능 문제가 발생할 수 있습니다.
물론 default_batch_fetch_size를 사용하면 쿼리가 여러 번 나갑니다.