前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JPA 逻辑删除

JPA 逻辑删除

作者头像
全栈程序员站长
发布2022-09-05 10:42:40
7120
发布2022-09-05 10:42:40
举报
文章被收录于专栏:全栈程序员必看

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

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

@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); }

代码语言:javascript
复制
@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.cn/137129.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档