基于Spring JPA Criteria Query实现AssetItem多条件分页查询
基于Criteria Query的动态查询实现
1. 改造Repository接口
要使用Criteria Query,你的Repository需要继承JpaSpecificationExecutor<AssetItem>,这样才能支持动态条件的分页查询:
public interface AssetItemRepository extends JpaRepository<AssetItem, Long>, JpaSpecificationExecutor<AssetItem> { }
2. 完善Service层的查询逻辑
在findByCondition方法中,根据AssetItemDto的参数动态构建查询条件:
import org.springframework.data.jpa.domain.Specification; import org.springframework.util.StringUtils; import javax.persistence.criteria.Predicate; import java.util.ArrayList; import java.util.List; public Page<AssetItemDto> findByCondition(AssetItemDto assetItemDto, Pageable pageable) { // 构建动态查询条件 Specification<AssetItem> spec = (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); // 当name非空时,添加name匹配条件 if (StringUtils.hasText(assetItemDto.getName())) { predicates.add(cb.equal(root.get("name"), assetItemDto.getName())); } // 当code非空时,添加code匹配条件 if (StringUtils.hasText(assetItemDto.getCode())) { predicates.add(cb.equal(root.get("code"), assetItemDto.getCode())); } // 所有条件用AND连接,自动适配参数组合情况 return cb.and(predicates.toArray(new Predicate[0])); }; // 执行分页查询 Page<AssetItem> entityPage = repository.findAll(spec, pageable); // 转换为DTO分页对象(假设mapList是你已实现的实体转DTO工具方法) return new PageImpl<>(mapList(entityPage.getContent(), AssetItemDto.class), pageable, entityPage.getTotalElements()); }
逻辑说明
- 用
StringUtils.hasText()判断参数是否为有效非空值(排除空字符串、全空格的情况) - 动态生成查询条件:
- 若name和code都非空,自动生成
name = ? AND code = ?的查询 - 仅name非空时,只执行
name = ?的查询;仅code非空时同理
- 若name和code都非空,自动生成
- 依赖
JpaSpecificationExecutor的findAll方法实现带条件的分页查询
注意事项
- 确保
AssetItem实体类中存在与DTO对应的name、code字段,且与数据库表字段映射正确 - 引入代码中所需的Spring Data JPA及JPA Criteria相关依赖包
内容的提问来源于stack exchange,提问作者Mohit H
相关产品推荐
相关产品推荐

