首先继承JpaSpecificationExecutor<T>接口

需要用到JpaSpecificationExecutor<T>中的Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable);//多条件分页查询

ITpSamplerInfoService.java

Page<TpSamplerInfo> findByConditionPage(Long samplerCode,String crossName,Pageable pageable);

TpSamplerInfoServiceImpl.java实现类

@Autowired
ITpSamplerInfoDao samplerInfoDao;//继承JpaSpecificationExecutor<T>

@Override
public Page<TpSamplerInfo> findByConditionPage(Long samplerCode,String crossName, Pageable pageable) {
Page<TpSamplerInfo> pageList = samplerInfoDao.findAll(new Specification<TpSamplerInfo>() {
@Override
public Predicate toPredicate(Root<TpSamplerInfo> root, CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
List<Predicate> list = new ArrayList<Predicate>();
if(samplerCode!=null) {
list.add(criteriaBuilder.like(root.get("samplerCode"), "%"+samplerCode+"%"));
}
if(crossName!=null) {
//外键对象的属性,要用join再get
list.add(criteriaBuilder.like(root.join("tpCrossroadInfo").get("crssroadName"), crossName));
}
Predicate[] array = new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(array));
}
},pageable);
return pageList;
}
//例子2,查询时间段内的记录
@Override
public Page<MapPack> findAll(Integer code, String startData, String endData, Pageable pageable) {
Page<MapPack> pageList = getMapPackDao().findAll(new Specification<MapPack>() { @Override
public Predicate toPredicate(Root<MapPack> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdfmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (StringUtils.isNotEmpty(startData) && StringUtils.isNotEmpty(endData)) {
try {
list.add(cb.between(root.get("registerTime"),
sdfmat.parse(sdfmat.format(sdf.parse(startData).getTime())),
sdfmat.parse(sdfmat.format(sdf.parse(endData).getTime() + 86400000))));
} catch (ParseException e) {
e.printStackTrace();
}
}
if(code!=-1) {
list.add(cb.equal(root.join("city").get("id").as(String.class), code));
}
Predicate[] array = new Predicate[list.size()];
return cb.and(list.toArray(array));
}
}, pageable);
return pageList;
}

  

  

 controller

@RequestMapping("/getAllSamplerInfo")
public Map<String,Object> findByConditionPage(@RequestParam("pageNumber") int page,@RequestParam("pageSize") int size,
@RequestParam("samplerCode") Long samplerCode,@RequestParam("crossName") String crossName){
Map<String,Object> map = new HashMap<String, Object>();
Pageable pageable = PageRequest.of(page-1, size, Direction.DESC, "id");
Page<TpSamplerInfo> pageList = tpSamplerInfoService.findByConditionPage(samplerCode,crossName, pageable);
//使用值对象Vo包装一下实体类,解决递归问题
List<TpSamplerInfoVo> list = new ArrayList<>();
pageList.forEach(pl->{
TpSamplerInfoVo tpVo = new TpSamplerInfoVo(pl);
list.add(tpVo);
});
map.put("rows", list);
map.put("total", pageList.getTotalElements()); return map; }

注意:在多条件查询时候查询id主键的时候遇到过一个错误

Parameter value [%3%] did not match expected type [java.lang.Long (n/a)]      意思是参数不匹配预期类型,id是Long类型

解决办法:list.add(criteriaBuilder.like(root.get("id").as(String.class), "%"+crossId+"%"));

加上as(String.class)就不会出现类型不匹配的问题

 

jpa多条件查询的更多相关文章

  1. jpa多条件查询重写Specification的toPredicate方法(转)

    Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...

  2. springboot jpa 多条件查询(多表)

    前几天写的,贴上来. 实体类. package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /** * ...

  3. springboot jpa 多条件查询(单表)

    需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...

  4. Spring Boot Jpa 多条件查询+排序+分页

    事情有点多,于是快一个月没写东西了,今天补上上次说的. JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将 ...

  5. spring data jpa 组合条件查询封装

    /** * 定义一个查询条件容器 * @author lee * * @param <T> */ public class Criteria<T> implements Spe ...

  6. spring jpa : 多条件查询

    https://www.cnblogs.com/Donnnnnn/p/6277872.html 方式一: 第一步:EmpAccNumService package com.payease.scford ...

  7. 【JPA】表达条件查询的关键字

    1.通过解析方法名创建查询 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find.findBy.read.readBy.get.getBy,然后对剩下部分进行解析.并且如果方法的最后一 ...

  8. Spring Data JPA,一种动态条件查询的写法

    我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...

  9. Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)

    推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...

随机推荐

  1. vscode设置中文,设置中文不成功问题

    刚安装好的vscode界面显示英文,如何设置中文呢? 在locale.json界面设置”locale":"zh-cn"也未能实现界面为中文,在网上找了参考了,以下教程真实 ...

  2. post方式发送接收文件

    //文件post发送 var express = require('express');var router = express.Router();var request = require(&quo ...

  3. centos7安装java开发环境

    一. 安装jdk 1.进入oracle官网下载jdk-8u152-linux-x64.tar.gz,用WinScp将文件上传到/usr/local文件下 2.解压:执行命令 tar –xzvf jdk ...

  4. 前端小结(3)---- 添加遮罩层,并弹出div

    有如下div: <div id='pop-div' class="pop-box"> <div class="input-group has-info& ...

  5. 使用JS完成首页轮播图效果

    获取document.getElementById("id名称"); 事件onload 定时操作setInterval("changeImg()",3000); ...

  6. 空白符对HTML结构的影响与解决方案

    何为空白符? 空白符: 空格.制表符.换行符 注意:浏览器在解析HTML时会把所有空白符合并成一个空格 空白符对HTML结构的影响 HTML5中<textarea>标签placeholde ...

  7. (转) AJAX POST&跨域 解决方案 - CORS

    跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免 ...

  8. CentOS 7运维管理笔记(11)----解决配置静态IP还是会出现动态IP地址的问题

    网上搜集CentOS7 配置静态IP的方法,基本上都是说在 /etc/sysconfig/network-scripts/ifcfg-eth0文件中做如下配置 TYPE=Ethernet HWADDR ...

  9. CentOS 7运维管理笔记(7)----Apache 基于端口的虚拟主机配置

    如果一台服务器只有一个IP或需要通过不同的端口访问不同的虚拟主机,可以使用基于端口的虚拟主机配置. (1) 在虚拟机的CentOS7服务器上配置 eth0:4 为192.168.1.214: (2) ...

  10. 如何实现Docker应用的自定义弹性伸缩

    简介 现在有很多客户很关心应用的自动弹性伸缩,有些客户也有自己的监控框架,并希望能跟阿里云容器服务进行集成.阿里云容器服务提供了服务弹性伸缩触发器,并能够跟监控框架集成来实现自定义的服务自动弹性伸缩. ...