本篇前提:

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. 【穿插】Python基础之文件、文件夹的创建,对上一期代码进行优化

    在上一期妹子图的爬虫教程中,我们将图片都保存在了代码当前目录下,这样并不便于浏览,我们应该将同一个模特的图片都放在一个文件夹中. 今天我们就简单讲一下Python下如何创建文件.文件夹,今后就可以用上 ...

  2. influxDB聚合类函数

    1)count()函数 返回一个(field)字段中的非空值的数量. SELECT COUNT(<field_key>) FROM <measurement_name> [WH ...

  3. ubuntu14.0 hadoop2.4.0 64位基于jdk1.7搭建

    注意:hadoop有两种运行模式,安全模式和非安全模式.安装模式是以指定在健壮的,基于身份验证上运行的,本文无需运行在非安全模式下,可以直接使用root用户. 本文用户是基于root用户来运行的 一. ...

  4. 基于网页api(接口)实现查快递

    之前在网上找到一款下载某慕课网站的java版软件,我想知道他是怎么实现:对于视频的下载的,毕竟网页源码中大都不会直接放视频的地址,但是没有公布源码,我就反编译,等到了部分“源码”,逻辑上还是有些问题, ...

  5. flask信号

    骚师博客:信号 信号你就可以这么理解,请求比喻成赛车,请求走的流程就是赛车道,而信号坐落在赛车道上的加油站和维修站,信号注册的函数好比维修站的人,每经过维修站并且维修站里有人就进行维修 信号这里理解: ...

  6. 洛谷 P4171 [JSOI]满汉全席

    洛谷 最近刚刚学的2-sat,就刷了这道裸题. 2-sat问题一般是用tarjan求的,当出现(x,y)或(!x,y)或(x,!y)三种选择时,我们可以把!x->y,!y->x连边. 然后 ...

  7. python函数回顾:abs()

    函数:abs() 官方英文文档解释 abs(x) Return the absolute value of a number. The argument may be a plain or long ...

  8. [二次开发]dede文章页面怎样显示作者的头像

    dede在文章页面显示作者仅仅是显示其username,可是假如我想把dede改造成较为社交化的站点.我认为是有必要显示作者的头像的,可是官方并没有相应的模版标签. 在网上看到解决问题的办法基本上是直 ...

  9. 玩转NumPy数组

    一.Numpy 数值类型 1.前言:Python 本身支持的数值类型有 int(整型, long 长整型).float(浮点型).bool(布尔型) 和 complex(复数型).而 Numpy 支持 ...

  10. flask实例化参数以及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...