Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提:
SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字段查询,下面通过泛型改写了这个方法:
import java.util.List; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.SingularAttribute; import org.springframework.data.jpa.domain.Specification; /**
*create by yyc 2017年6月12日下午3:26:25
*/
public class SpecificationUtil {
public static <T, Y> Specification<T> getSpec(SingularAttribute<? super T,Y> sa, Integer parameter){
return new Specification<T>() { @SuppressWarnings("unused")
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate p1 = null;
if (-1 != parameter ) {
Predicate p2 = cb.equal(root.get(sa), parameter);
if (p1 != null) {
p1=cb.and(p1, p2);
} else {
p1 = p2;
}
}
return p1;
}
};
}
public static <T, Y> Specification<T> getSpec2(SingularAttribute<? super T,Y> sa,List<Integer> parameters){
return new Specification<T>() { @Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate p1 = null;
if (null != parameters ) {
Predicate p2=null;
for (Integer parameter : parameters) {
p2= cb.equal(root.get(sa), parameter);
if (p1 != null) {
p1=cb.and(p1, p2);
}else {
p1 = p2;
}
}
}
return p1;
}
};
}
}
利用 java泛型,实现了基本的查询通用方法。
该类中第一个方法getSpec(SingularAttribute<? super T,Y> sa, Integer parameter) 传入一个SingularAttribute和对应的int参数;
第二个方法getSpec2(SingularAttribute<? super T,Y> sa,List<Integer> parameters) 传入一个SingularAttribute和对应的int参数集合。
第一个方法适用于对单张表只有一个int条件的情况,而第二个方法适用于对单张表有多个int条件的情况。
使用:
第一个方法的使用:
SpecificationUtil.getSpec(Company_.acCode, areacode)就是调用这个方法,根据areacode这个字段进行查询,finAll方法的第二个参数是关于分页和排序的了。
Repository.findAll(SpecificationUtil.getSpec(Company_.acCode, areacode),
new PageRequest(vo.getPage(), vo.getSize(), new Sort(Direction.ASC, "comId")));
第二个方法的使用:
SpecificationUtil.getSpec2(Waterdtudev_.comId, companyIds)根据多个comId进行查询,comId是一个Integer型的,companyIds就是一个List<Integer>。
Repository.findAll(SpecificationUtil.getSpec2(Waterdtudev_.comId, companyIds),
new PageRequest(vo.getPage(), vo.getSize(), new Sort(Direction.ASC, "wdId")));
Spring data jpa 实现简单动态查询的通用Specification方法的更多相关文章
- Spring Data JPA中的动态查询 时间日期
功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...
- Spring Data JPA 的 Specifications动态查询
主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询. ...
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)
推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...
- spring data jpa使用原生sql查询
spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...
- spring data jpa 的简单使用
先说简单一下JPA 概念:JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据. 影响 ...
- Spring Data Jpa的四种查询方式
一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...
- spring data jpa 利用@Query进行查询
参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...
- spring data jpa实现多条件查询(分页和不分页)
目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...
随机推荐
- hdu1174(3维射线与圆是否相交)
简单的题意,要注意z2 = h2*0.9-r2 #include <iostream> #include <cmath> #include <vector> #in ...
- grafana-----Time Range Controls
Grafana提供了许多方法来管理时间的可视化数据的范围,在Dashboard-level和Panel-level都有. 在右上角,您有主仪表板时间选择器(它位于“Zoom out”和“Refresh ...
- 【转】Power System 中基于 VIOS 的虚拟以太网实现
基于 VIOS 的虚拟以太网适配器的工作原理和配置实现 本文对 Power 系统中基于 VIOS 的虚拟以太网适配器(Virtual Ethernet Adapter)的工作原理.基本配置选项和配置步 ...
- JavaWeb—Servlet
1.什么是Servlet 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即需要事先将html文件准备好,并存放到web服务器上面.不能够处理动态资源的请求(需要计算,动态 ...
- NPOI 导入 导出
using NPOI.XSSF.UserModel; using System.IO; 导入 /// <summary> /// Excel转换DataTable /// </s ...
- C#中时间的Ticks属性
C#中时间的Ticks属性是一个很大的长整数,单位是 100 毫微秒.表示自 0001 年 1 月 1 日午夜 12:00:00 以来已经过的时间的以 100 毫微秒为间隔的间隔数,已经说得很清楚了, ...
- 【转】Linux查看物理CPU个数、核数、逻辑CPU个数
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat /proc/cpuinfo| g ...
- iOS copy 和 mutableCopy 学习
(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy 有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...
- Oracle索引表
索引组织表(Index-Organized Table)是按B-树的结构来组织和存储数据的.与标准表中的数据时无序存放的不同,索引表中数据按主键值有序存储. 叶子节点中存放的是表的主键值与所有非主键值 ...
- $《第一行代码:Android》读书笔记——第8章 通知和手机多媒体
本章主要介绍了通知.短信.调用摄像头和相册.播放多媒体文件等内容. (一)通知的用法 1.通知的基本用法 见如下代码(详细操作步骤在代码注释中): (1)先创建一个布局文件,其中只有一个名为“发送通知 ...