LoginSignup
0
0

More than 1 year has passed since last update.

Spring Data JPAのカラム名でハマったところ【Unknown column '○○' in 'field list'】

Posted at

Spring boot,JPA,MySQLを使用して、DB接続した際にカラムに関するエラーが発生してハマってしまったので忘備録として残しておく。

タスク管理アプリ作成しており、タスクテーブルに対応するentityであるTaskクラスを作成してアプリを起動した時に以下のエラーが発生した。

【発生したエラー】
Unknown column 'created_date' in 'field list'

フィールドに'create_date'という不明なものがあると言っているのはわかるが、以下の通り、entityでは'createdDate'と書いているし、MySQLでも同様の名前で命名している。

Task.java
@Entity
public class Task {
	
	@Id
	@GeneratedValue
	private int id;
	
	@Column
	private int user_id;
	
	@Column
	private String title;
	
	@Column
	private String task;
	
	@Column(updatable = false)
	@CreationTimestamp
	private Timestamp createdDate;
	
	@Column
	@UpdateTimestamp
	private Timestamp updatedDate;
}

テーブルの構造↓(面倒なので画像で)

スクリーンショット 2022-04-22 1.08.39.png

'created_date'というフィールドはないのにエラーでは存在していると言われて原因と解決方法がわからずハマってしまった。

原因と対応策

JPA(Hibernate)の仕様によるものでキャメルケースで命名されたフィールドはスネークケースに変換されるようだ。

調べたところ、Hibernateでは以下の順に変換を行ってからカラム名が作成される。(デフォルト)

①論理名の生成
クラス名、フィールド名を論理名として取得し、@Column@Tableで指定されていれば、その文字列を論理名にする

②物理名の生成
ピリオドをアンダーバーに置き換える
キャメルケースをスネークケースに置き換える

今回の場合、タスクテーブルのカラム'createdDate'に対応するTaskクラスのフィールド名をそのまま'createdDate'としていたが、'created_date'に変換されてしまったため、カラム名に対応していなくてエラーが発生した。

対応策として、タスクテーブルのカラム名を'created_date'に変更したことで解決できたが、entity側を修正する場合は@Column(name="createddate")のように全て小文字にすれば問題なく取得できるとのこと。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0