目录

前言

一、specification是什么?

二、使用方法

1.repository继承JpaSpecificationExecutor接口

2.service层构造specification

2.1 各成员含义解析

2.2 sql对比

3. 构造完成之后的使用

总结



前言

本文主要介绍我对于jpa中specification相关概念的理解和简单的使用介绍。欢迎大家探讨。


提示:以下是本篇文章正文内容,下面案例可供参考

一、specification是什么?

我的理解就是specification主要是用来构造复杂查询条件的东西。

二、使用方法

1.repository继承JpaSpecificationExecutor接口

代码如下(示例):JpaSpecificationExecutor<T> 这个泛型一般就是表的实体类

@Repository
public interface StudentRepository extends JpaRepository<StudentEntity, Long>, JpaSpecificationExecutor<StudentEntity> {
}

2.service层构造specification

一般来说使用过程如图

@Service
public class StudentService {@Resourceprivate StudentRepository studentRepository;/*** 根据给出的条件查询** @param req 查询请求* @return 查询结果*/public List<StudentEntity> getStudentByConditions(QueryStudentReq req) {// 通过给出的条件构造查询语句specificationSpecification<StudentEntity> specification = buildSpecification(req);// 通过构造的specification来进行查询return studentRepository.findAll(specification);}/*** 构造specification的类** @param req 查询请求* @return 可以理解为根据查询请求构造的sql*/Specification<StudentEntity> buildSpecification(QueryStudentReq req) {// 通过给出的条件构造查询语句specificationSpecification<StudentEntity> specification = new Specification<StudentEntity>() {// 重写构造方法@Overridepublic Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {/*root : 当前所用的表,与Root<T> root中的T对应的表query: 最后构造查询语句cb :查询条件的构造器*/List<Predicate> condition = new ArrayList<>();// 查询所有姓名中包含关键字的学生信息condition.add(cb.like(root.get("name"), "%"+req.getNameKeyword()+"%"));// todo 根据条件构造查询语句Predicate[] predicates = new Predicate[condition.size()];\// 使用cb构造查询语句query.where(cb.and(condition.toArray(predicates)));return query.getRestriction();}};return specification;}
}

2.1 各成员含义解析

其中最重要的就是那个重写的public Predicate toPredicate方法,

Predicate   可以理解为where中的一个查询条件

cb   是帮助我们生成条件构造器

root   就是当前

2.2 sql对比

上述代码对应的sql为:

select * from student s where s.name like "%"+查询关键字+"%"

root.get("name") 这个就相当于 s.name,把这个字段给拿出来操作,ike由cb.like来完成。

之所以说这么多是因为我踩过的一个巨坑:

select * from student s where s.name in (xxx,xxx)

我想的sql是这样子的,但是在cb中找了半天没有in啊,有的那个感觉也不会用,最后反应过来,可以通过

root.get("name").in(xxx)来操作!

使用的过程中请一定注意查询条件之间是and链接还是or链接,不要最后一个cb.and()把条件全部and链接了(捂脸)

cb中的方法非常之多,几乎涵盖了sql中where查询的方方面面,官方文档为:https://docs.oracle.com/javaee/6/api/javax/persistence/criteria/CriteriaBuilder.html

3. 构造完成之后的使用

直接使用repository.find或findAll来查询

    public List<StudentEntity> getStudentByConditions(QueryStudentReq req) {// 通过给出的条件构造查询语句specificationSpecification<StudentEntity> specification = buildSpecification(req);// 通过构造的specification来进行查询return studentRepository.findAll(specification);}

分页查询的话就传入自己构造的pageable,记得返回类型Page<T>的对象哦

     return studentRepository.findAll(specification, pageable);

总结

本文主要记录分享一下specification的基本使用方法,如果错误还请批评指正,也欢迎大家一起探讨交流!转载请注明出处。

specification jpa 复杂查询相关推荐

  1. Spring data jpa 条件查询-按时间段查询

    Spring data jpa 条件查询-按时间段查询 @Overridepublic Page<泛型> findRecordList(int couponDetailId, int pa ...

  2. jpa中::::_项目学生:JPA标准查询

    jpa中:::: 这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server , 业务层 , ...

  3. 项目学生:JPA标准查询

    这是Project Student的一部分. 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server , 业务层 , 具有Spring ...

  4. jpa分页查询_spring data jpa 居然提供了这么多查询方式!

    spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...

  5. Spring Boot JPA的查询语句

    文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...

  6. jpa的查询api_为JPA的本机查询API键入安全查询

    jpa的查询api 当您使用JPA时-有时-JPQL不能解决问题,您将不得不使用本机SQL. 从一开始,像Hibernate这样的ORM就为这些情况保留了开放的"后门",并为Spr ...

  7. Spring Boot+JPA 有查询条件的查询

    本篇介绍使用JPA 的条件查询, 关于JPA基本查询可以参考: Spring Boot+JPA 查询数据方式与代码演示 不安全的查询 在开发时, 为了简便, 习惯会拼接Where子句的查询条件, 查询 ...

  8. JPA criteria 查询:类型安全与面向对象

    序言 自工作以来,除了以前比较流量的hibernate,就是一直使用ORM 规范 JPA了.而这几天工作需要,研究了下JPA的标准查询,名为:JPA criteria查询.相比JPQL,其优势是类型安 ...

  9. jpa常用查询方法使用总结自定义sql查询

    文章目录 一.JPA自定义查询方法 实体类 1.1 单条件查询一条数据 1.2 单条件查询多条数据 1.3 多条件查询数据 1.4 查询某一个字段 1.5 in查询 1.6 like查询 二.自定义s ...

  10. SpringBoot JPA使用Specification多表查询LEFT JOIN

    1.Student package com.frank.jpaSpecification.entity;import lombok.AllArgsConstructor; import lombok. ...

最新文章

  1. Python中处理时间 —— time模块
  2. gis怎么通过水库划分子流域_到底是谁在革GIS的命?
  3. 一个技术转销售人员的感悟--深刻(转)
  4. 【编程5】斐波那契数列 + 递归+LeetCode50
  5. 机器学习中常见的损失函数
  6. 原来这才是日志打印的正确姿势!
  7. 熊猫TV直播H5播放器架构探索
  8. DeDE 后台登陆广告
  9. 简易的遍历文件加密解密
  10. 【Java】获取Java代码段运行毫秒数的策略
  11. 少走弯路,给3~5年程序员的唯一一条建议
  12. kali root默认密码_Kali Linux root 默认密码是:toor
  13. JavaScript——面向对象之继承(原型对象)与多态(重载、重写)
  14. Postman接口测试工具学习笔记(一)接口测试概念及Postman入门
  15. Tomcat安装与配置教程(图文教学)
  16. 嵌入式Linux--使用libpng库解码png图片
  17. 宝鸡渭滨区11―12学年度第一学期高二期末联考试卷高二地理
  18. 官方免费数据下载全国行政区划具体到村
  19. Banner在线制作网站介绍以及如何Springboot中使用
  20. 微信小程序(五)--- Vant组件库,API Promise化,MboX全局数据共享,分包相关

热门文章

  1. day8--socket回顾
  2. arcgis js(二)显示三维地图
  3. uva_10066 The Twin Towers
  4. windows xp系统重装之u盘装系统,u盘安装xp系统
  5. IDEA 默认浏览器修改设置
  6. 大O记法-BigO notation
  7. Foxmail不显示图片的处理方法
  8. C++ stack 遍历
  9. 人参鹿鞭片39.9/花花公子裤子29/除螨仪9.9/三合一数据线8.8/阿迪达斯沐浴露39.9/超多好物你等!...
  10. python脚本王者荣耀自动刷金币