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


相关推荐

  • npm和cnpm安装

    npm和cnpm安装npm和cnpm安装1.npm安装(1)去nodejs官网下载:http://nodejs.cn/download/(2)安装到目录C:\ProgramFiles\nodejs下(3)打开命令提示符窗口,window+R,输入cmd命令行输入npm-v如果报错,就打开控制面板-系统和安全-系统中打开高级系统配置,把nodejs的安装目录添加到环境变量中,例如我的就是C:\Prog…

    2022年10月15日
    2
  • npm的卸载与安装流程

    安装1、下载地址为:https://nodejs.org/en/2、检查是否安装成功:如果输出版本号,说明我们安装node环境成功3、为了提高我们的效率,可以使用淘宝的镜像:http://npm.taobao.org/输入:npminstall-gcnpm–registry=https://registry.npm.taobao.org,即可安装npm镜像,以后再用到npm的地方…

    2022年4月5日
    431
  • 使用BCGControlBar界面库美化MFC界面的详细过程

    使用BCGControlBar界面库美化MFC界面的详细过程系统环境:Windows7软件环境:VisualStudio2013本次目的:实现MFC对话框换肤下载安装BCGControlBar25激活成功教程版安装完成自动弹出编译库文件的对话框,选择需要的进行编译,需要一段时间,等候,完成打开vs2013首先使用BCGPAppWizard建立工程:Applicationtype:Dialog

    2022年10月8日
    1
  • pycharm导入numpy出错_pycharm安装numpy很慢

    pycharm导入numpy出错_pycharm安装numpy很慢今天在使用pycharm写代码时,调用了Numpy这个库,但是报错了,提醒了Nomodulenamed’numpy’。最后知道了一个快速的解决办法:1.在pycharm里:点击file–&gt;settings:2.点击project–&gt;projectinterpreter3.然后点击右边的+号进入一个添加库的的界面,然后搜索你需要的库,在右下角点击安装,然后等待安装,安装…

    2022年8月27日
    5
  • JAVA学习–getInstance「建议收藏」

    JAVA学习–getInstancepublicstaticDBConnectinstance; publicstaticDBConnectgetInstance(){ if(instance==null){  instance=newDBconnect(); } returninstance;…

    2022年4月14日
    56
  • K8S部署LNMP集群访问wordpress[通俗易懂]

    K8S部署LNMP集群访问wordpress[通俗易懂]K8S部署LNMP集群访问wordpress

    2022年4月20日
    62

发表回复

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

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