jpa实现查询物理删除的数据,未被删除的数据

本文介绍了一种使用Java实现的广告查询方法,通过指定条件筛选已删除和未删除的广告记录。利用Spring Data JPA提供的Specification接口来构建动态查询,实现了灵活高效的数据库操作。
摘要由CSDN通过智能技术生成
/**
     * 查找删除的广告
     */
    public Page<Advertising> findDeleteAd(Pageable pageable ){
   
    Page<Advertising> page =  advertisingRepository.findAll(new Specification<Advertising>(){
    /**
    * root是查询结果的一个实体对象,也就是查询结果返回的主要对象
    * criteriaQuery是构建查询条件,里面的方法都是各种查询方式,distinct,select,where,groupby,having,orderby这些方法
    * criteriaBuilder 这个接口 主要是用来进行一些函数操作
    */
@Override

public Predicate toPredicate(Root<Advertising> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

                                //root得到deleted的属性,criteriaQuery是引出distinct,select,where,groupby,having,orderby这些方法,criteriaBuilder调用具体的条件

query.where(cb.equal(root.get("deleted"), true));

return null;
}
   
    },pageable);
return page;
    }

//查询没有删除的广告
public Page<Advertising> findNotDeletedAd(Pageable pageable) {
Page<Advertising> page =  advertisingRepository.findAll(new Specification<Advertising>(){
@Override
public Predicate toPredicate(Root<Advertising> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
// TODO Auto-generated method stub
query.where(cb.equal(root.get("deleted"), false));
return null;
}
   
    },pageable);
return page;
}
在 Spring JPA 中进行伪删除通常使用的是软删除(Soft Delete)。 软删除是指将数据标记为已删除,但实际上并不从数据库中删除数据。这样做可以保留被删除数据的历史记录,同时避免了删除操作对其他数据的影响。 要实现删除,可以在实体类中添加一个标识已删除状态的字段,例如: ```java @Entity public class User { @Id private Long id; private String name; private boolean deleted; // 省略 getter 和 setter } ``` 当删除用户时,只需要将 deleted 字段设置为 true 即可: ```java userRepository.deleteById(userId); // 或者 User user = userRepository.findById(userId).orElseThrow(); user.setDeleted(true); userRepository.save(user); ``` 当查询用户时,可以使用 JPA 的 Criteria API 或者 JPQL 来获取删除数据: ```java CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<User> query = cb.createQuery(User.class); Root<User> root = query.from(User.class); query.where(cb.isFalse(root.get("deleted"))); List<User> users = entityManager.createQuery(query).getResultList(); // 或者 String jpql = "SELECT u FROM User u WHERE u.deleted = false"; List<User> users = entityManager.createQuery(jpql, User.class).getResultList(); ``` 对于软删除实现,还有一些其他的细节需要注意,例如: - 需要在数据库中创建一个索引来加速软删除查询; - 需要在 JPA 的默认查询中排除已删除数据; - 需要在查询语句中手动包含已删除数据时使用 UNION ALL 而不是 UNION。 综上,软删除虽然比物理删除更为安全,但需要在实现时考虑到多方面的因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值