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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu安装搜狗输入法后黑屏_乌班图如何安装搜狗输入法

    ubuntu安装搜狗输入法后黑屏_乌班图如何安装搜狗输入法1、ubuntu系统配置systemsettings->languagesupport->install/removelanguages,在弹出的菜单中选择Chinese(simplified),点击apply2、配置输入法框架搜狗输入法是建立在fcitx框架之上的,所以要将输入法框架选择为fictx,注意:如果没有fcitx选项,那么你就需…

    2022年9月26日
    6
  • Java集合Stream类filter的使用

    Java集合Stream类filter的使用之前的Java集合中removeIf的使用一文写了使用removeIf来实现按条件对集合进行过滤。这篇文章使用同样是JDK1.8新加入的Stream中filter方法来实现同样的效果。

    2022年6月12日
    51
  • Java字符串分割函数split「建议收藏」

    Java字符串分割函数split「建议收藏」Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: 1.split方法 将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 基本格式:stringObj.split([separator,[limit]]) (1)stringObj 必选项。要被分解的对象即你想要进行操作的字符串,该对象…

    2022年6月17日
    29
  • HTTP详解(1)-工作原理「建议收藏」

    HTTP详解(1)-工作原理「建议收藏」1.HTTP简介HTTP协议(HyperTextTransferProtocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。在了解HTTP如何工作之前,我…

    2022年6月7日
    31
  • java fgc_记一次频繁FGC的简单排查

    java fgc_记一次频繁FGC的简单排查简书占小狼转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注周末愉快,今天有时间记录一下上周遇到的一个问题,学习的脚步不能放慢,也不敢放慢。存在问题在线上环境进行服务压测,压测完成后,cpu使用率居高不下,很是费解,按理说已经没有压测请求了,这时消耗cpu资源的只有GC线程了,可以通过jstat命令查看一下JVM的GC情况,然后就碰到了诡异的GC问题。jstat命令jstat[…

    2022年6月19日
    29
  • hmacsha256算法原理_一次解析

    hmacsha256算法原理_一次解析需要支持HMACSHA256算法,GitHub找到源码具体地址https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c移植到目标平台,稍作处理测试ok了,原理:1.输入密钥key和固定的数据(0x36)进行异或操作生成一个64B的数据kx;2.使用kx+输入数据执行sha256算法得到32B的out;3.使用…

    2025年8月15日
    3

发表回复

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

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