0Pricing
Java Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JPAアノテーションによるエンティティマッピング
  2. Spring Dataリポジトリとクエリメソッド
  3. 1対多と多対多のリレーションシップ
  4. ページネーション、ソート、プロジェクション
← Java Academyに戻る