本篇前提:

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. K - Children of the Candy Corn(待续)

    K - Children of the Candy Corn Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d ...

  2. Consul文档收藏

    英文:https://www.consul.io/intro/getting-started/install.html 中文:http://www.liangxiansen.cn/2017/04/06 ...

  3. SSL逐渐演变到TLS

    w https://zh.wikipedia.org/wiki/超文本传输安全协议

  4. 【转】图解MySql命令行创建存储过程

    一 操作实例 首先登录mysql: 使用source命令,从命令行执行sql脚本,创建表: 创建第一个存储过程: 事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";&q ...

  5. 读取用户家目录下的配置文件到properties

    String conf = System.getProperty("user.home") + File.separator + "a.properties"; ...

  6. Django模型中OneToOneField和ForeignKey的区别

    网上看到一篇讲解"Django模型中OneToOneField和ForeignKey区别" 的文章,浅显易懂; 可以把ForeignKey形象的类比为: ForeignKey是on ...

  7. Java替换字符串中的占位符

    在开发中,会有动态配置字符串其中的某些字符,如何使用字符中的占位符,并且在代码动态替换占位符实现动态配置字符串! 1.定义字符串时,再string文件添加字符串: 注意!记得要在字符文件中加上这些: ...

  8. Python常见序列详解

    一.Python中序列的分类 常见序列类型包括字符串(普通字符串和unicode字符串),列表和元组.所谓序列,即成员有序排列,可通过下标访问. 二.Python序列通用操作 下面我们将分别以字符串. ...

  9. 解决网络 下载 句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))

    首先要共享该文件 其次 在安全里加IISSHARED 是IIS账号 下载代码 #region 下载        /// <summary>        /// 下载        // ...

  10. ACM解题之快速输出杨辉三角形(前68行)

    题意: 本题要求计算并输出杨辉三角形的前 68 行. Time Limit:1000MS Memory Limit:65536K 解题: 为了能在规定时间准确输出杨辉三角形的前68行,这里我用了精准的 ...