今回は、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ではなくロジックに集中ができる(コード作成)利点があると言われているので、それだけでも価値があるでしょう。
