- 部屋(Room)テーブルと備品(Equipment)テーブルがあり、それぞれ1対多のリレーションがあるとする。


- JPQLでの結合をしてみる。
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.example.demo.entity.Room;
public interface RoomRepository extends JpaRepository<Room, Integer> {
@Query("SELECT r FROM Room r LEFT OUTER JOIN r.equipments")
List<Room> find();
}
独特な構文だが、この書き方の場合、RoomテーブルをSELECTした後に、Equipmentテーブルを1件ずつ取得する、いわゆるN+1問題が発生する。
①Roomテーブルのselect
select
r1_0.room_id,
r1_0.invalid,
r1_0.room_name
from
room r1_0 left join equipment e1_0 on r1_0.room_id=e1_0.room_id
②①で取得したRoomテーブルのレコードのうち、
Equipmentテーブルに紐づくレコードがある場合、都度selectを行う。
select
e1_0.room_id,
e1_0.equipment_id,
e1_0.equipment_name,
e1_0.invalid
from
equipment e1_0
where
e1_0.room_id=?
binding parameter [1] as [INTEGER] - [1]
select
e1_0.room_id,
e1_0.equipment_id,
e1_0.equipment_name,
e1_0.invalid
from
equipment e1_0
where
e1_0.room_id=?
binding parameter [1] as [INTEGER] - [2]
select
e1_0.room_id,
e1_0.equipment_id,
e1_0.equipment_name,
e1_0.invalid
from
equipment e1_0
where
e1_0.room_id=?
binding parameter [1] as [INTEGER] - [3k]- これを防ぐにはJOIN FETCHを行う。
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.example.demo.entity.Room;
public interface RoomRepository extends JpaRepository<Room, Integer> {
@Query("SELECT r FROM Room r LEFT OUTER JOIN FETCH r.equipments")
List<Room> find();
}
- 実行結果を見ると一度のクエリで結合情報を取得できていた。
select
r1_0.room_id,
e1_0.room_id,
e1_0.equipment_id,
e1_0.equipment_name,
e1_0.invalid,
r1_0.invalid,
r1_0.room_name
from
room r1_0 left join equipment e1_0
on r1_0.room_id=e1_0.room_id- よほどの理由がない限り、JPQLで結合を行うときはFETCHをつけること。
JPA LED テールランプ Type3 シーケンシャルウインカー テールライト 互換車種:Ninja ZX-25R ZX25R ZX-4R ZX4R ZX-6R ZX6R ZX-10R ZX10R
¥10,500 (2025年12月21日 23:09 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)【モデル詳細】エレガントなType-3・・・レンズカラー:ダークスモーク、発光バーカラー:センターレッド、左右クリア 【主な適合車種】ZX-10R (2016-)、ZX-6R (2019-)、ZX-4R (2023-)、ZX-25R (2020-)、Ninja400 (2018-)、Ninja250 (2018-)、Z1000 (2014-)、Z400 (2019-)、Z250 (2019-)、他 【商品の詳細】 オープニングモーション:キーONでテールランプ演出後、通常点灯になります。シーケン... もっと読む
[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S
20% オフ機能性のコンプレッションvネック長袖スポーツtシャツ ストレッチ性に優れ、どんな動きにも最適なフィット感 吸汗速乾のナノドライ繊維、激しい運動の後もさらっとした着心地。 テスラのブランドロゴが”TSLA”へ変更されました。予めご了承くださいませ。 出品者の商品をもっと見る:https://www.amazon.co.jp/s?i=merchant-items&me=A11PVUG4KEPUE4





![[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S #1](https://m.media-amazon.com/images/I/31BNHbD5mCL._SL100_.jpg)
![[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S #2](https://m.media-amazon.com/images/I/31g4byIr+lL._SL100_.jpg)
![[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S #3](https://m.media-amazon.com/images/I/41x6f9ZwRjL._SL100_.jpg)
![[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S #4](https://m.media-amazon.com/images/I/313mGKf0uvL._SL100_.jpg)
![[テスラ] コンプレッションウェア メンズ vネック [UVカット・吸汗速乾] コンプレッションシャツ スポーツインナー ランニング トレーニング フィットネス スポーツ Tシャツ ベースレイヤー アンダー 加圧シャツ MUV01-JPA_S #5](https://m.media-amazon.com/images/I/31lr0YMzHGL._SL100_.jpg)



コメント