jpa多条件查询
首先继承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多条件查询的更多相关文章
- jpa多条件查询重写Specification的toPredicate方法(转)
Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...
- springboot jpa 多条件查询(多表)
前几天写的,贴上来. 实体类. package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /** * ...
- springboot jpa 多条件查询(单表)
需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...
- Spring Boot Jpa 多条件查询+排序+分页
事情有点多,于是快一个月没写东西了,今天补上上次说的. JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将 ...
- spring data jpa 组合条件查询封装
/** * 定义一个查询条件容器 * @author lee * * @param <T> */ public class Criteria<T> implements Spe ...
- spring jpa : 多条件查询
https://www.cnblogs.com/Donnnnnn/p/6277872.html 方式一: 第一步:EmpAccNumService package com.payease.scford ...
- 【JPA】表达条件查询的关键字
1.通过解析方法名创建查询 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find.findBy.read.readBy.get.getBy,然后对剩下部分进行解析.并且如果方法的最后一 ...
- Spring Data JPA,一种动态条件查询的写法
我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...
- Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)
推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...
随机推荐
- GC回收策略
判读一个对象是否“已死”: 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 至少主流的J ...
- Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...
- 基数排序——Java实现
一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...
- react-native一些好的组件
一.移动端路由 react-navigator 二.移动端本地储存 react-native-storage(https://github.com/sunnylqm/react-native-stor ...
- 第三次scrum作业!
1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 刘洋江 薛思汝 2.个人在小组第三次冲刺任务及其完成情况描述 根据小组讨论所分配任务,积极辅助组长以及各个成员,理清思路,编写代码,尽量在规定时间 ...
- Kettle数据抽取解决方案
一. Kettle介绍 1. Kettle简介 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.Kettle的中文翻译为水壶.Kettle以元数据驱动的方式提供 ...
- html tags and attribute集参考
cite 表示引用到某一本书籍名称,默认样式为斜体,q 表示直接引用到里面的话,大块的引用使用block默认样式将增加“双引号” ,关键的词用<b>默认为粗体:一些技术术语则用<i& ...
- SQL Server 2014 聚集列存储
SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...
- Day02——Python基本数据类型
一.运算符 1.算数运算符 2.比较运算符 3.复制运算符 4.逻辑运算符 5.成员运算符 二.基本数据类型 1.数字 整数(int) 在32位机器上,整数的位数为32位,取值范围为-2**31-2* ...
- centos7主机名的修改
在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始 ...