以下の記事は下記の条件のものになります
環境
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行でregist
とdate
に分割されてしまうことで
ソート時の条件指定でエラーが発生します。
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に変更する必要ありますが[未検証])
という意見あるかもしれませんが、カラム名はスネークケースがいいのでこのままで