本篇前提:

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方法的更多相关文章

  1. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  2. Spring Data JPA 的 Specifications动态查询

    主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询. ...

  3. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

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

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

  5. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  6. spring data jpa 的简单使用

    先说简单一下JPA 概念:JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据. 影响 ...

  7. Spring Data Jpa的四种查询方式

    一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...

  8. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

  9. spring data jpa实现多条件查询(分页和不分页)

    目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...

随机推荐

  1. 带参数的main函数

    带参数的main函数 int main(int argc,char **argv)  或int main(int argc,char *argv[])  /*解析 依据<C程序设计语言(第二版. ...

  2. eclipse远程debug Java程序

    使用Eclipse JPDA远程调试Java程序 本文将介绍使用Eclipse JPDA,在Eclipse的开发环境下对远程运行的Java程序进行调试操作. 请按以下步骤进行(本人已经在Eclipse ...

  3. 22个所见即所得在线Web编辑器

    这些 Web 编辑器可以在线编辑和处理富 Web 内容,包括格式文本,表格,图片,媒体,链接等等,非常适合集成到 CMS网站内容管理系统中使用.本文又搜集了 22 个 Web 在线编辑器,它们基本代表 ...

  4. 数据库之MySQL(三)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 临时表搜索 SELECT   *FRO ...

  5. B-Tree vs LSM-tree

    什么是B-树 一.已排序文件的查找时间 对一个有N笔记录的已排序表进行二叉查找,可以在O(log2N)比较级完成.如果表有1,000,000笔记录,那么定位其中一笔记录,将在20 ( log21,00 ...

  6. MongoDB学习笔记—概念解析

    Mongo基本概念 下表将帮助您更容易理解Mongo中的一些概念: SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection ...

  7. java中使用axis发布和调用webService及dom4j解析xml字符串

    工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService. 需要的jar包: webService服务端: import javax.jws.WebMetho ...

  8. windows下python调用c文件流程

    1.新建fun.c文件和fun.h文件 #include <stdio.h> #include <stdlib.h> #include <string.h> int ...

  9. 佳能相机操作 EDSDK 教程 C# 版本

    http://blog.csdn.net/zajin/article/details/17021339    介绍 佳能EOS数码SDK是一个 可以用来远程控制其数码单反相机相当强大的SDK.不幸的是 ...

  10. Oracle表约束

    约束的概述: 约束是在表中定义的用于维护数据库完整性的一些规则 (1).主键约束 不能为空也不能重复 在一个表中只能定义一个主键约束 Oracle会在主键上建立一个唯一索引,可以指定唯一索引的存储位置 ...