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


相关推荐

  • String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别一、JavaString类——String字符串常量字符串广泛应用 在Java编程中,在Java中字符串属于对象,Java提供了 String类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可…

    2022年6月28日
  • pycharm如何配置编译环境_python不配置环境变量会怎样

    pycharm如何配置编译环境_python不配置环境变量会怎样随便打开一个.py文件时,右上角三角形运行按钮不能选中,需要配置编译环境配置编译环境有两个部分:1、添加编译器(interpreter)位置;2、添加脚本(所打开的.py文件)位置,具体步骤如下:①pycharm左上角依次点击File→Settings…→ProjectInterpreter点击右上的小齿轮→Add,选择下面的Existingenvironment选项,再在目录中寻找带python.exe的文件夹(本文最下面贴了如何寻找这个文件位置),然后点OK这里可以看到所有已安装的第

    2022年8月28日
  • linux(1)Mac上传文件到Linux服务器

    linux(1)Mac上传文件到Linux服务器前言我们使用mac时,想让本地文件上传至服务器,该怎么办呢windows系统,我们可以使用xftp或者rz命令,那么mac呢?mac系统,我们可以使用sftp、scp或者rz命令,本文介绍sft

    2022年7月31日
  • Linux 端口被进程多次占用,LINUX最好用查看端口占用并杀死(kill)的方式「建议收藏」

    Linux 端口被进程多次占用,LINUX最好用查看端口占用并杀死(kill)的方式

    2022年2月9日
  • Java实现字符串逆序输出

    Java实现字符串逆序输出【题目描述】写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。【输入】一行字符【输出】逆序后的字符串【样例输入】123456abcdef【样例输出】fedcba654321 【解题思路】首先定义两个String字符串a,b,其中a用于存放正序的字符串,b用于存放逆序的字符串,然后在定义一个字符数组c,然后调用类库中的t…

    2022年7月16日
  • 解决:error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No

    解决:error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No解决OpenSSL:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:No解决OpenSSL:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfil…

    2022年6月29日

发表回复

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

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