如何在Spring JPA分页查询中过滤is_deleted为true的Skill实体?
实现分页查询时过滤已删除的Skill数据
这里有几种简单直接的实现方式,你可以根据需求选择:
1. 利用Spring Data JPA的方法名推导(最简便)
直接修改原有的分页查询方法名,通过方法名自动生成过滤条件:
public interface SkillRepository extends JpaRepository<Skill, Long> { // 过滤is_deleted=true的数据,同时按displayOrder升序分页查询 Page<Skill> findAllByIsDeletedFalseOrderByDisplayOrderAsc(Pageable pageable); }
Spring Data JPA会自动解析方法名,生成包含WHERE is_deleted = false条件的SQL,同时保留原有的排序和分页逻辑。
2. 自定义JPQL查询(适合复杂场景)
如果需要更灵活的查询逻辑,可以用@Query注解写自定义JPQL:
public interface SkillRepository extends JpaRepository<Skill, Long> { @Query("SELECT s FROM Skill s WHERE s.isDeleted = false ORDER BY s.displayOrder ASC") Page<Skill> findAllNonDeletedSkills(Pageable pageable); }
这种方式可以手动控制查询语句,适合后续需要添加更多过滤条件的场景。
3. 使用Specification实现动态过滤(适合多条件动态组合)
如果后续可能需要动态添加其他过滤条件,可以用Specification来封装过滤逻辑:
首先定义一个获取过滤Specification的方法:
public class SkillSpecifications { public static Specification<Skill> nonDeleted() { return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("isDeleted"), false); } }
然后在业务层调用时传入这个Specification:
// 业务层调用示例 Page<Skill> skills = skillRepository.findAll( SkillSpecifications.nonDeleted(), PageRequest.of(pageNum, pageSize, Sort.by(Sort.Direction.ASC, "displayOrder")) );
这种方式的优势是可以灵活组合多个过滤条件,比如后续要加名称模糊查询,直接新增一个Specification并组合即可。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

