【Spring Boot】SELECTで関連テーブルの値を取得したい【JPA】

JPA

例えば以下のような関連テーブルがあるとする。

roomテーブル

equipmentテーブル

この2つのテーブルは1対多の関係にあるとする。
(roomのidと、equipmentのroom_idが紐づくとします)
※DB的には特に外部キーの設定はありません。

各テーブルのEntityを以下の通り定義する。

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.OneToMany;


/**
 * The persistent class for the room database table.
 * 
 */
@Entity
@NamedQuery(name="Room.findAll", query="SELECT r FROM Room r")
public class Room implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;

	private String als;

	@Column(name="room_name")
	private String roomName;

	private String unqals;
	
	@OneToMany(fetch = FetchType.EAGER, cascade= CascadeType.ALL)
  @JoinColumn(name = "room_id")
	private List<Equipment> equipments = new ArrayList<>();
  //以下省略
}
package com.example.demo.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.annotations.NamedQuery;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;


/**
 * The persistent class for the equipment database table.
 * 
 */
@Entity
@NamedQuery(name="Equipment.findAll", query="SELECT e FROM Equipment e")
public class Equipment implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;

	@Column(name="equipment_name")
	private String equipmentName;

	@Column(name="room_id")
	private int roomId;
	
	@OneToMany(mappedBy = "equipment")
 	private List<Test> tests = new ArrayList<>();


	public Equipment() {
	}
// 以下省略
}

親テーブル的には、@JoinColumnでnameプロパティに子テーブルの紐づけたいカラム名を指定する。(Roomテーブルの主キーと、Equipmentテーブルのroom_idが紐づくことになる)

@OneToMany(fetch = FetchType.EAGER, cascade= CascadeType.ALL)
@JoinColumn(name = "room_id")
private List<Equipment> equipments = new ArrayList<>();

実行時のSQL結果ログをを見ると以下の通り

2024-01-21T19:41:30.733+09:00 DEBUG 9748 --- [nio-8080-exec-6] org.hibernate.SQL                        : 
    select
        r1_0.id,
        r1_0.als,
        r1_0.room_name,
        r1_0.unqals 
    from
        room r1_0 
    where
        r1_0.id=?
2024-01-21T19:41:30.734+09:00 TRACE 9748 --- [nio-8080-exec-6] org.hibernate.orm.jdbc.bind              : binding parameter (1:INTEGER) <- [1]
2024-01-21T19:41:30.736+09:00 DEBUG 9748 --- [nio-8080-exec-6] org.hibernate.SQL                        : 
    select
        e1_0.room_id,
        e1_0.id,
        e1_0.equipment_name 
    from
        equipment e1_0 
    where
        e1_0.room_id=?
2024-01-21T19:41:30.736+09:00 TRACE 9748 --- [nio-8080-exec-6] org.hibernate.orm.jdbc.bind              : binding parameter (1:INTEGER) <- [1]
タイトルとURLをコピーしました