読者です 読者をやめる 読者になる 読者になる

DeltaSpike Data Module(使いそうなところだけ)まとめ2

DeltaSpike JPA

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);
}