JPA多条件动态查询

    科技2025-07-28  13

    JPA如何根据前台传的多个参数(有的有值,有的没有值),进行like、equals等复杂,动态查询数据

    主要使用以下几个类

    SpecificationPredicateCriteriaQueryCriteriaBuilderPagingAndSortingRepositoryJpaSpecificationExecutor

    1.代码

    1-1.entity

    @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "T_MGR_PROJECT_WORKFLOW" , catalog = "iworkh_java") public class ProjectWorkFlow { @Id @Column(name = "WF_ID") private String wfId; @Column(name = "WF_NAME",nullable = true, length = 200) private String wfName; @Column(name = "PROJECT_ID",nullable = true, length = 200) private String projectId; .... }

    1-2.repository

    public interface ProjectWorkFlowRepository extends PagingAndSortingRepository<ProjectWorkFlow, String>, JpaSpecificationExecutor<ProjectWorkFlow> { }

    注意:这必须要继承类PagingAndSortingRepository和JpaSpecificationExecutor

    1-3.service

    public class JobWorkflowService { @Autowired ProjectWorkFlowRepository projectWorkFlowRepository; public Page<ProjectWorkFlow> getJobWorkflowListByPage(WorkflowQueryData.QueryData queryData, Pageable pageable){ Specification specificationQuery = new Specification<ProjectWorkFlow>() { @Override public Predicate toPredicate(Root<ProjectWorkFlow> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> list = new ArrayList<>(); if (StringUtils.isNoneBlank(queryData.getWfName())) { Path<String> wfNamePath = root.get("wfName"); Predicate wfNameLike = criteriaBuilder.like(wfNamePath, "%"+queryData.getWfName()+"%"); list.add(criteriaBuilder.and(wfNameLike)); } if (StringUtils.isNoneBlank(queryData.getProjectId())) { Path<String> projectIdPath = root.get("projectId"); Predicate projectIdEqual = criteriaBuilder.equal(projectIdPath, queryData.getProjectId()); list.add(criteriaBuilder.and(projectIdEqual)); } Predicate[] p = new Predicate[list.size()]; return criteriaBuilder.and(list.toArray(p)); } }; Page<ProjectWorkFlow> pageRows =projectWorkFlowRepository.findAll(specificationQuery, pageable); return pageRows; } }

    2.方法介绍

    2-1.toPredicate

    public Predicate toPredicate(Root<DevWarnPo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) CriteriaQuery<?> criteriaQuery

    这是一个面向对象查询,代表的是Specific的顶层查询对象, 它包含查询的各个部分:select,from,where,group by, order by等,不过它是一个面向对象的查询方式,只对实体类型,嵌入式类型的Criteria查询起作用。

    Root<T> root

    代表要查询的对象,也就是实体类型,实体类型好比sql语句中的from后的表。传入实体类型后,会被CriteriaQuery的父类AbstractQuery.from将实体类型传入

    CriterBuilder criteriaBuilder

    用来构建CriteriaQuery的构建器对象Predicate(谓语),即:一个简单或者复杂的谓语类型,相当于条件或者多条件集合。

    Predicate

    就是多条件查询中的条件,可以通过List 实现多个条件操作。

    3.推荐

    个人博客

    能读到文章最后,首先得谢谢您对本文的肯定,你的肯定是对博主最大的鼓励。

    你觉本文有帮助,那就点个👍 你有疑问,那就留下您的💬 怕把我弄丢了,那就把我⭐ 电脑不方便看,那就把发到你📲

    Processed: 0.012, SQL: 8