博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA多条件动态查询
阅读量:4302 次
发布时间:2019-05-27

本文共 2853 字,大约阅读时间需要 9 分钟。

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
, JpaSpecificationExecutor
{
}

注意:这必须要继承类PagingAndSortingRepositoryJpaSpecificationExecutor

1-3.service

public class JobWorkflowService {
@Autowired ProjectWorkFlowRepository projectWorkFlowRepository; public Page
getJobWorkflowListByPage(WorkflowQueryData.QueryData queryData, Pageable pageable){
Specification specificationQuery = new Specification
() {
@Override public Predicate toPredicate(Root
root, CriteriaQuery
criteriaQuery, CriteriaBuilder criteriaBuilder) {
List
list = new ArrayList<>(); if (StringUtils.isNoneBlank(queryData.getWfName())) {
Path
wfNamePath = root.get("wfName"); Predicate wfNameLike = criteriaBuilder.like(wfNamePath, "%"+queryData.getWfName()+"%"); list.add(criteriaBuilder.and(wfNameLike)); } if (StringUtils.isNoneBlank(queryData.getProjectId())) {
Path
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
pageRows =projectWorkFlowRepository.findAll(specificationQuery, pageable); return pageRows; }}

2.方法介绍

2-1.toPredicate

public Predicate toPredicate(Root
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.推荐

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

你觉本文有帮助,那就点个👍

你有疑问,那就留下您的💬
怕把我弄丢了,那就把我⭐
电脑不方便看,那就把发到你📲

转载地址:http://dkhws.baihongyu.com/

你可能感兴趣的文章
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>
Git(四) - 分支管理
查看>>
PHP Curl发送数据
查看>>
HTTP协议
查看>>
HTTPS
查看>>
git add . git add -u git add -A区别
查看>>
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>
Laravel中的$loop
查看>>
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>