LoginSignup
1
2

More than 5 years have passed since last update.

Spring Bootで変数名にスネークケースを使ってはまったこと

Posted at

以下の記事は下記の条件のものになります

環境
Java:1.8
WebFramework:SpringBoot1.5.4
DB:MySQL
テーブル
id int
name varchar
regist_date Date

Spring BootでfindAllを使ってDBからデータを取得する際のソート条件にregist_dateを追加したところで下記のエラーが発生した。

No property regist found for type Entityのクラス名 with root cause

原因としては、Entityクラス内での変数名にスネークケースを使っていたことでした。
39行目のDELIMITERSに従って、259〜265行でregistdateに分割されてしまうことで
ソート時の条件指定でエラーが発生します。

org.springframework.data.mapping.PropertyPath.java
39. private static final String DELIMITERS = "_\\.";
40. private static final String ALL_UPPERCASE = "[A-Z0-9._$]+";
41. private static final Pattern SPLITTER = Pattern.compile("(?:[%s]?([%s]*?[^%s]+))".replaceAll("%s", DELIMITERS));

省略

253.    public static PropertyPath from(String source, TypeInformation<?> type) {
254.
255.        Assert.hasText(source, "Source must not be null or empty!");
256.        Assert.notNull(type, "TypeInformation must not be null or empty!");
257.
258.        List<String> iteratorSource = new ArrayList<String>();
259.        Matcher matcher = SPLITTER.matcher("_" + source);
260.
261.        while (matcher.find()) {
262.            iteratorSource.add(matcher.group(1));
263.        }
264.
265.        Iterator<String> parts = iteratorSource.iterator();

対策としては、スネークケースで書いていたところをキャメルケースに直したとなります。
エラーをみた時点でなんとなく察してはいたものの、

  • 変数名をカラム名とあわせたい
  • 原因がはっきりしていないのに方針を変更したくない

ということで調査しました。

あと、カラム名をキャメルケースにすれば変数名をあうのでは?
(SpringBootにおけるhibernateのNamingStrategyをEJB3NamingStrategyに変更する必要ありますが[未検証])
という意見あるかもしれませんが、カラム名はスネークケースがいいのでこのままで

参考
【追記修正】Spring Boot JPAでTableアノテーションを使ってテーブル名を指定する時の注意事項

1
2
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
1
2