Spring Dataリポジトリとクエリメソッド
JpaRepositoryを継承し、命名規則でクエリメソッドを定義して、カスタムJPQLには@Queryを使います。
「Spring Dataリポジトリとクエリメソッド」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
Spring Data JPAリポジトリ
JpaRepository<Entity, ID>を継承すると、CRUD、ページング、ソートのメソッドを無償で利用できます。Springが起動時に実装を生成するため、SQLやDAOの定型コードは必要ありません。
public interface UserRepository extends JpaRepository<User, Long> {
// Free: findAll, findById, save, delete, count, existsById, etc.
}派生クエリメソッド
Spring Dataはメソッド名からクエリを生成します。命名規則は、findBy + プロパティ + 任意の条件です。
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByStatus(UserStatus status);
Optional<User> findByEmail(String email);
List<User> findByAgeGreaterThanAndStatusOrderByNameAsc(int age, UserStatus s);
boolean existsByEmail(String email);
long countByStatus(UserStatus status);
}メソッド名で使用できるキーワード
主な命名キーワードは、And、Or、Is/Equals、Between、LessThan/GreaterThan、Like/NotLike、In/NotIn、IsNull/IsNotNull、OrderBy、First/Topです。
List<User> findTop5ByStatusOrderByCreatedAtDesc(UserStatus s);
List<User> findByNameContainingIgnoreCase(String fragment);
List<User> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);@QueryによるカスタムJPQL
メソッド名では表現できない複雑なクエリには、@Queryを使用します。JPQLでは、テーブル名やカラム名ではなく、エンティティのクラス名とフィールド名を使用します。
@Query("SELECT u FROM User u WHERE u.email = :email AND u.status = :status")
Optional<User> findActiveByEmail(@Param("email") String email,
@Param("status") UserStatus status);
@Query("SELECT u.name, COUNT(o) FROM User u JOIN u.orders o GROUP BY u.name")
List<Object[]> countOrdersPerUser();ネイティブクエリ
生のSQLを記述するには、nativeQuery = trueを使用します。ON CONFLICT、ウィンドウ関数、全文検索など、データベース固有の機能に便利です。
@Query(value = "SELECT * FROM users WHERE tsv @@ plainto_tsquery(:q)",
nativeQuery = true)
List<User> fullTextSearch(@Param("q") String query);@Modifyingによる変更クエリ
UPDATE/DELETEクエリに@Modifyingを付けます。変更クエリにはアクティブなトランザクションが必要なため、@Transactionalも追加してください。
@Modifying
@Transactional
@Query("UPDATE User u SET u.status = :s WHERE u.lastLogin < :cutoff")
int deactivateInactiveUsers(@Param("s") UserStatus s,
@Param("cutoff") LocalDateTime cutoff);派生削除メソッド
Spring Dataは、メソッド名から削除クエリも生成します。クリーンアップ処理に便利です。
void deleteByStatus(UserStatus status);
long deleteByCreatedAtBefore(LocalDateTime cutoff);リポジトリのスライス: CrudRepository、PagingAndSortingRepository
JpaRepositoryのすべてのメソッドが必要ない場合は、より限定された基底インターフェースを使用します。CrudRepositoryには基本的なCRUD機能があり、PagingAndSortingRepositoryはfindAll(Pageable)を追加します。
public interface ReadOnlyUserRepository extends PagingAndSortingRepository<User, Long> {
// Only paging + sorting — no save/delete
}@EntityGraphによるフェッチの最適化
@EntityGraphを使用すると、クエリごとにデフォルトのフェッチ戦略を上書きし、エンティティのマッピングを変更せずに関連付けをEagerに読み込めます。
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
Optional<User> findWithOrders(@Param("id") Long id);カスタムリポジトリ実装
UserRepositoryCustom + UserRepositoryCustomImplという命名規則でインターフェースと実装クラスを作成すると、カスタムメソッドを追加できます。Springがそれらを統合します。
public interface UserRepositoryCustom {
List<User> searchByCriteria(UserSearchCriteria criteria);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@PersistenceContext EntityManager em;
public List<User> searchByCriteria(UserSearchCriteria c) {
// use Criteria API or JdbcTemplate
}
}
public interface UserRepository extends JpaRepository<User,Long>, UserRepositoryCustom {}クイックチェック
UPDATE/DELETE文で、@Queryと併用する必要があるアノテーションはどれですか?
まとめ
JpaRepositoryを継承すると、CRUD機能を無償で利用できます。単純なクエリには派生メソッド名を使用します。複雑なJPQLやネイティブSQLには@Queryを使用します。更新には@Modifying+@Transactionalを使用します。フェッチの調整には@EntityGraphを使用します。
よくある質問
「Spring Dataリポジトリとクエリメソッド」レッスンは無料ですか?
はい。「Spring Dataリポジトリとクエリメソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「Spring Dataリポジトリとクエリメソッド」で何を学びますか?
JpaRepositoryを継承し、命名規則でクエリメソッドを定義して、カスタムJPQLには@Queryを使います。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Spring Dataリポジトリとクエリメソッド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JPAアノテーションによるエンティティマッピング
- Spring Dataリポジトリとクエリメソッド
- 1対多と多対多のリレーションシップ
- ページネーション、ソート、プロジェクション