JPA 逻辑删除

JPA 逻辑删除为了避免每次在查询的时候加上是否删除字段,做了一下封装。@NoRepositoryBean@RepositoryRestResource(exported=false)publicinterfaceBaseRepository<TextendsBaseEntity,IdTextendsLong>extendsJpaRepository<T…

大家好,又见面了,我是你们的朋友全栈君。

为了避免每次在查询的时候加上是否删除字段,做了一下封装。

@NoRepositoryBean
@RepositoryRestResource(exported = false)
public interface BaseRepository<T extends BaseEntity, IdT extends Long>
    extends JpaRepository<T, IdT> {

  @Query(
      value =
          "update #{#entityName} set deletedAt=current_timestamp where id = ?1 "
              + "and deletedAt is null")
  @Transactional
  @Modifying
  void delete(IdT id);

  @Override
  @Transactional
  default void delete(T entity) {
    delete((IdT) entity.getId());
  }

  @Transactional
  default void delete(Iterable<? extends T> entities) {
    entities.forEach(entitiy -> delete((IdT) entitiy.getId()));
  }

  @Override
  @Query(value = "update #{#entityName} set deletedAt=current_timestamp where deletedAt is null ")
  @Transactional
  @Modifying
  void deleteAll();

  @Query(
      value =
          "update #{#entityName} set deletedAt=current_timestamp where id in ?1 "
              + "and deletedAt is null ")
  @Transactional
  @Modifying
  void deleteInBatch(List<IdT> ids);
}
@NoRepositoryBean 使用了该注解的接口不会被单独创建实例,只会作为其他接口的父接口而被使用。
deletedAt 是否删除字段
@MappedSuperclass
@Data
public abstract class BaseEntity {

  private Timestamp deletedAt;

  public abstract Long getId();
}

@MappedSuperclass 通过这个注解,我们可以将该实体类当成基类实体,它不会隐射到数据库表,但继承它的子类实体在隐射时会自动扫描该基类实体的隐射属性,添加到子类实体的对应数据库表中。

 

@Data
@Entity
@Table(name = "indeed_api_keys")
@Where(clause = "deleted_at is null")
@NoArgsConstructor
public class IndeedApiKey extends BaseEntity implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  private String key;

  private static final long serialVersionUID = 1866497302444576352L;

}

实体继承BaseEntity,并加上 @Where(clause = “deleted_at is null”)

public interface EmailMessageRepository extends BaseRepository<EmailMessage, Long> {
  List<EmailMessage> findAllByApplicationId(Long applicationId);
  
@Query(
    value =
        "SELECT * FROM email_messages e WHERE e.deleted_at IS NULL AND "
            + "lower(?1)=lower(e.email_hash) ORDER BY e.created_at DESC",
    nativeQuery = true)
List<EmailMessage> findByEmailHash(String emailHash);
}

Repository继承BaseRepository

这样配置之后,若使用jpa默认的查询,就会自动加上 deleted_at is null的过滤条件。但当你重写jpa默认的查询机制,还是需要手动加上deleted_at is null的过滤条件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137129.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于朴素贝叶斯的文本分类算法「建议收藏」

    基于朴素贝叶斯的文本分类算法「建议收藏」基于朴素贝叶斯的文本分类算法摘要:常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用。本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模型(MM),实现了可运行的代码,并进行了一些数据测试。关键字:朴素贝叶斯;文本分类第1章贝叶斯原理1.1贝叶斯公式[1]已知某条件概率,如何得到两个事件交换后的概率,也就…

    2022年5月17日
    34
  • constexpr和常量表达式

    constexpr和常量表达式常量表达式常量表达式(constexpression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。constinta=3;//a是常量表达式constintb=a+1;//b是常量表达式intc=8;//c不是常量表达式,因为c的数据类型是int而不是constintco

    2022年9月29日
    0
  • 认识EJB_ej是什么的缩写

    认识EJB_ej是什么的缩写一、定义       将业务逻辑从客户端软件中抽取出来,封装在一个组件中。这个组件运行在一个独立的服务器上,客户端软件通过网络调用组件提供的服务以实现业务逻辑,而客户端软件的功能单纯到只负责发送调用请求和显示处理结果。在J2EE中,这个运行在一个独立的服务器上,并封装了业务逻辑的组件就是EJB(EnterpriseJavaBean)组件。EJB体系结构中涉及以下6类软件构件:1

    2025年7月2日
    0
  • 如何更改linux文件的拥有者及用户组(chown和chgrp)[通俗易懂]

    如何更改linux文件的拥有者及用户组(chown和chgrp)[通俗易懂]本文整理自:http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/http://ydlmlh.iteye.com/blog/1435157一、基本知识在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者及用户组,当然root用户可以修改任何文…

    2022年6月7日
    30
  • 虚拟存储管理_虚拟存储管理的基本条件

    虚拟存储管理_虚拟存储管理的基本条件必要性:前面的各种存储管理方式必须一次性全部装入内存才可以运行,直至作业运行结束才能释放全部内存资源,所以存在:(1)内存不满足作业地址空间要求时就不能运行(2)大量作业要求运行时只有少数作业装入内存运行,其他作业留在辅存等待程序执行呈现局部性特征,程序的执行局限于某个部分局限性⎧⎩⎨时间局限性{某条指令被执行,不久之后指令可能再次执行某条数据被访问,不久之后数据可能再次空间局限性…

    2022年9月26日
    0
  • linux内核版本指什么意思,Linux的内核版本是怎么回事「建议收藏」

    linux内核版本指什么意思,Linux的内核版本是怎么回事「建议收藏」Linux的内核版本编号有点像如下的样子:<2.6.32-642.el6.x86_64主版本.次版本.发布版本-修改版本>虽然编号就是如上的方式来编写,不过依据Linux内核的发展历程,内核版本的定义有点不太相同。Linux的内核版本奇数、偶数版本分类在2.6x版本以前,托瓦斯将内核的发展方向分为两类,并根据这两类内核的发展分别给予不同的内核编号,那就是:主、次版本为奇数:开发中版本如…

    2022年8月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号