Spring Data JPAのCRUDとQuery Methods:findBy~命名ルール徹底解説
生徒
「Spring Data JPAでデータを検索する方法って、どんな書き方があるんですか?」
先生
「Spring Data JPAでは、findByで始まるメソッド名を使って簡単に検索処理が書けますよ。命名ルールに従えば、SQLを書かずに検索できます。」
生徒
「メソッド名だけで検索できるなんて便利ですね。どんなルールになっているのか詳しく知りたいです。」
先生
「それでは、Spring Data JPAのCRUD操作とQuery Methodsの基本を一緒に見ていきましょう!」
1. Spring Data JPAでのCRUDとは?
Spring Data JPAは、Javaでデータベースとやり取りする際の手間を大幅に減らしてくれる便利なライブラリです。特にCRUD操作、つまりデータの作成(Create)、取得(Read)、更新(Update)、削除(Delete)を、専用のメソッドや命名ルールを使うだけで簡単に実装できます。
CRUD操作を行うには、JpaRepositoryを継承したインターフェースを作成するだけでOKです。以下がその基本の書き方です。
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
2. findByとは何か?Query Methodsの基本
Spring Data JPAでは、リポジトリにfindByというプレフィックスを付けたメソッドを定義することで、SQLを一切書かずに検索機能を実装できます。これを「Query Method(クエリメソッド)」と呼びます。
たとえば、ユーザーの名前で検索したいときは、以下のようにfindByNameというメソッドを定義するだけでOKです。
List<User> findByName(String name);
このように、メソッド名から自動的にJPQL(Java Persistence Query Language)を生成してくれるのがQuery Methodsの魅力です。
3. Query Methodsの命名ルール:基本構文
Spring Data JPAのQuery Methodsでは、findByに続けてエンティティのフィールド名をつけることで、自動的に検索処理を作成してくれます。基本構文は以下の通りです。
- findByフィールド名:一致するデータを検索
- findByフィールド名And他フィールド名:複数条件で検索
- findByフィールド名OrderBy他フィールド名Desc:並び替え付き
例えば、名前とメールアドレスの両方で検索する場合は次のようになります。
List<User> findByNameAndEmail(String name, String email);
4. 条件演算子の活用:ContainingやBetweenなど
Query Methodsでは、さまざまな演算子を使って柔軟な検索が可能です。以下によく使う演算子をまとめます。
findByNameContaining:部分一致検索(LIKE)findByAgeBetween:範囲検索findByActiveTrue:真偽値による検索findByCreatedAtAfter:指定日付より後findByCreatedAtBefore:指定日付より前
たとえば、名前に「山」が含まれているユーザーを検索するには、以下のように書きます。
List<User> findByNameContaining(String keyword);
5. ソート・並び替えの記述方法
Query Methodsでは、結果のソート(昇順・降順)もメソッド名に記述できます。OrderByを使い、対象フィールドにAscやDescをつけるだけです。
List<User> findByAgeGreaterThanOrderByNameAsc(int age);
この例では、指定した年齢より大きいユーザーを名前順(昇順)で取得します。
6. Optionalの活用でnull安全に
1件だけを取得する場合は、戻り値にOptionalを使うことで、nullチェックを安全に行うことができます。
Optional<User> findByEmail(String email);
取得できなかった場合もOptional.empty()が返るので、nullによるエラーを防げます。
7. JPQLや@Queryとの使い分け
Query Methodsで書けない複雑なクエリが必要なときは、@Queryアノテーションを使ってJPQLを明示的に書くことができます。
@Query("SELECT u FROM User u WHERE u.name LIKE %:keyword%")
List<User> searchByName(@Param("keyword") String keyword);
ただし、単純な検索であればfindBy命名ルールで十分対応可能なので、まずは命名ベースで書くのがおすすめです。
8. 実務で役立つfindBy命名例まとめ
以下は実務でよく使われるfindBy命名例です。
findByUsername:ユーザー名で検索findByStatusAndRole:状態と役割で検索findByTitleContainingOrderByCreatedAtDesc:タイトル部分一致+作成日降順findByEmailIsNotNull:メールが設定されているユーザー
このような命名規則を理解しておくことで、Spring Data JPAで柔軟かつ高速な開発が可能になります。