JPA多条件查询

  1. 1.代码
    1. 1-1.entity
    2. 1-2.repository
    3. 1-3.service
  2. 2.方法介绍
    1. 2-1.toPredicate

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

主要使用

  • Specification
  • Predicate
  • CriteriaQuery
  • CriteriaBuilder
  • PagingAndSortingRepository
  • JpaSpecificationExecutor

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> {

}

注意:这必须要继承类PagingAndSortingRepositoryJpaSpecificationExecutor

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 实现多个条件操作。


转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 157162006@qq.com

文章标题:JPA多条件查询

字数:476

本文作者:沐雨云楼

发布时间:2020-06-03, 21:38:04

最后更新:2020-10-06, 10:20:38

原始链接:https://iworkh.gitee.io/blog/2020/06/03/java-jpa-query-multi-param/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

pgmanor iworkh gitee