JPA – 共通条件を指定する方法

今回は、Web Application開発時によくある共通カラム(論理削除を管理するカラム)の書き方について調べてみようと思います。

状況

論理削除を管理するカラム「is_deleted」カラムがあるとします。

public interface AdvisorRepository extends JpaRepository<Advisor, Long> {

    List<Advisor> findByIsDeletedFalse();
    List<Advisor> findByExpertiseAndIsDeletedFalse(Expertise expertise);
    List<Advisor> findByGenderAndIsDeletedFalse(Gender gender);
    List<Advisor> findByExpertiseAndGenderIsDeletedFalse(Expertise expertise, Gender gender);

}

上記のように「IsDeletedFalse」を全部のメソッドのいれるべきなのか!の状況ですね。

@Whereアノテーション

Entityのクラスアノテーションとして、 共通の条件を指定するアノテーションです。

@Getter
@NoArgsConstructor
@Entity
@Where(clause = "is_delete = false")
public class Advisor extends BaseTimeEntity {

 ...............
    
    @Column(name = "is_delete",  nullable = false)
    private boolean isDeleted;
}

上記はEntityクラスに共通条件として「is_delete = false」を入れています。

こう書くことでJpaRepositoryのメソッドからIsDeletedFalseは削除できます。

public interface AdvisorRepository extends JpaRepository<Advisor, Long> {

    // List<Advisor> findAll(); はディフォルトである。
    List<Advisor> findByExpertise(Expertise expertise);
    List<Advisor> findByGender(Gender gender);
    List<Advisor> findByExpertiseAndGender(Expertise expertise, Gender gender);

}

終わりに

勉強すればするほど出てきます。新しい言語を勉強している感じです。でも、学んでおくとSQLではなくロジックに集中ができる(コード作成)利点があると言われているので、それだけでも価値があるでしょう。

コメントを残す