DeltaSpike Data Module(使いそうなところだけ)まとめ2
Query Method Expressions
メソッド名をちゃんと(分かりやすく)付ければコメントいらない。分かりやすいメソッド名でクエリを作ってしまおう。ということらしい。
メソッド式を使う(Using Method Expressions)
@Entity public class Person { @Id @GeneratedValue private Long id; private String name; private Integer age; private Gender gender; } @Repository public interface PersonRepository extends EntityRepository<Person, Long> { List<Person> findByNameLikeAndAgeBetweenAndGender(String name, int minAge, int maxAge, Gender gender); }
- 戻り値はEntity(1件) or List
(複数)のどちらか - メソッド名は「findBy」で始める
- キャメル形式で「プロパティ名 + 比較演算子」を繋げる
- 比較演算子は「Equal」「Like」etc... SQLで馴染みのもの
- 複数条件の場合、「And」 or 「Or」で繋げる
- 引数は比較演算子に応じて追加する (Betweenはminとmaxの2つ、IsNull, IsNotNullは0、他は引数1つを追加)
サンプルの場合、
WHERE name like (引数name) AND BETWEEN (引数minAge) AND (引数maxAge) AND gender = (引数gender)
という条件のSQLを実行してくれるらしい。・・・わざわざSQLを書かなくてもいいとか素敵過ぎ。 genderがオブジェクトになっているので、実際はgenderの主キーが検索条件になるはず。
ソート(Query Ordering)
OrderBy + プロパティ名 + 「Asc or Desc」を付けるだけ。もちろん複数指定可。
List<Person> findByLastNameLikeOrderByAgeAscLastNameDesc(String lastName);
ORDER BY age ASC, lastName DESC
ネストプロパティ(Nested Properties)
ネストプロパティはアンダースコア「_」で指定する。
List<Person> findByCompany_companyName(String companyName);
WHERE company.companyName = (引数companyName)
クエリオプション(Query Options)
主にページングで。
List<Person> findByNameLike(String name, @FirstResult int start, @MaxResults int pageSize);
LIMIT pageSize OFFSET start
メソッド接頭語(Method Prefix)
メソッド接頭語「findBy」がお気に召さない? 安心して下さい、変えれますよ。
@Repository(methodPrefix = "fetchWith") public interface PersonRepository extends EntityRepository<Person, Long> { List<Person> fetchWithNameLike(String name, @FirstResult int start, @MaxResults int pageSize); }