😬
Spring boot 検索
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 '%検索キーワード%';
@Query
を使う場合
2.2 使用ケース
複雑なクエリを実装したい場合や特定の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