😬

Spring boot 検索

2024/10/22に公開

Spring bootで検索処理を実装する際に調べたものをメモ

1. 動的にSQLを生成する場合

使用ケース
検索条件が可変で、複雑な条件を動的に追加する必要がある場合。

使用技術
Criteria API: プログラム的にクエリを構築。

利点
柔軟性が高く、条件を自由に変更できる。
コンパイル時に型安全が確保される。


// CriteriaBuilderを使用してクエリを作成するためのビルダーオブジェクトを取得
CriteriaBuilder cb = entityManager.getCriteriaBuilder();

// Jobエンティティを対象にしたクエリオブジェクトを作成
CriteriaQuery<Job> query = cb.createQuery(Job.class);

// Jobエンティティをクエリのルートとして設定(FROM句に相当)
Root<Job> job = query.from(Job.class);

// 検索条件を保持するためのリストを作成
List<Predicate> predicates = new ArrayList<>();

// 検索条件がnullでなく、空文字列でない場合、titleにLIKE句を追加
if (title != null && !title.isEmpty()) {
    // titleカラムに対して部分一致検索を指定するLIKE句を作成し、predicatesに追加
    predicates.add(cb.like(job.get("title"), "%" + title + "%"));
}

// すべての条件をANDで結合してWHERE句を作成し、クエリに適用
query.select(job).where(cb.and(predicates.toArray(new Predicate[0])));

2. 静的にSQLを生成する場合

2.1 カスタムメソッドを使用する場合

使用ケース
Spring Data JPAの命名規則に基づいて自動的にクエリを生成したい場合。

使用技術
Spring Data JPAのメソッド名規則: findBy プレフィックスを使ったカスタムメソッド。

利点
メソッド名に基づいてクエリが自動生成されるため、手間が少ない。
複雑なJPQLやSQLを書く必要がない。

List<Job> findByTitleContaining(String title);

このメソッドを呼び出すと、以下のSQLが生成されます:

SELECT * FROM job WHERE title LIKE '%検索キーワード%';

2.2 @Queryを使う場合

使用ケース
複雑なクエリを実装したい場合や特定のSQL文を直接指定する必要がある場合。

使用技術
@Query アノテーション: 明示的にJPQLまたはSQLを定義。

利点
高度なクエリや特定の要件に応じたクエリを直接書ける。
複雑なロジックを簡潔に表現できる。

@Query("SELECT j FROM Job j WHERE j.title LIKE %:title% AND j.status = :status")
List<Job> findByTitleAndStatus(@Param("title") String title, @Param("status") String status);

2.3 ネイティブSQLを使用する場合

使用ケース
データベースに依存する特定の最適化や、特定のSQL構文を利用したい場合。

使用技術
@Query + nativeQuery: ネイティブSQL文を直接実行。

利点
データベース固有の最適化や機能を利用できる。
複雑なSQL文をそのまま使用可能。

@Query(value = "SELECT * FROM job WHERE title LIKE %:title% AND status = :status", nativeQuery = true)
List<Job> findByTitleAndStatusNative(@Param("title") String title, @Param("status") String status);
  • 実行されるSQL:
SELECT * FROM job WHERE title LIKE '%検索キーワード%' AND status = 'ACTIVE';

感想

静的なら@Query使えば簡単そうだし(多少はsqlを書く練習にもなる)、動的な場合はCriteria APIを使えば良いって感じ

Discussion