Spring Data Jpa之高级查询(jpa-spec插件)

友情链接:Spring Data Jpa的动态查询库 https://github.com/wenhao/jpa-spec

功能介绍

  1. 兼容Spring Data Jpa 和JPA2.1接口。
  2. Equal/NotEqual/Like/NotLike/In/NotIn支持可变参数, Equal/NotEqual 支持空(Null)值。
  3. 每个条件支持关联查询。
  4. 支持自定义条件查询。
  5. 条件构建器。
  6. 支持分页和排序。

导包:

<dependency>
  <groupId>com.github.wenhao</groupId>
  <artifactId>jpa-spec</artifactId>
  <version>3.1.1</version>
  <!-- 把所有依赖都过滤 -->
  <exclusions>
    <exclusion>
      <groupId>*</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>

详细的使用文档:

https://github.com/wenhao/jpa-spec/blob/master/docs/3.1.0_cn.md

https://www.w3cschool.cn/jpaspec/

思路分析:

1 用户传的数据有0-n个

2 所以要准备一个对象接收用户传过来的数据==》Query对象

3 分页的条件对我们来说也是封装到Query对象中的

Query对象(抽个父类):

public abstract class BaseQuery {
    private int currentPage=1;
    private int currentSize=10;
    private boolean sort = true;
    private String sortByColumn;
    //写成抽象类,子类必须实现
    public abstract Specification getSpecification();
    //分页加排序
    public Pageable getPageable(){
        Pageable pageRequest =new PageRequest(currentPage, currentSize);
        if (sortByColumn!=null&&!"".equals(sortByColumn)){
            if (sort){
                Sort sort = new Sort(Sort.Direction.ASC,sortByColumn);
                pageRequest = new PageRequest(currentPage, currentSize,sort);
                return pageRequest;
            }
            Sort sort = new Sort(Sort.Direction.DESC,sortByColumn);
            pageRequest = new PageRequest(currentPage, currentSize,sort);
            return pageRequest;
        }
        return pageRequest;
    }
    //拿到排序
    public Sort getSort(){
        if (sortByColumn!=null&&!"".equals(sortByColumn)){
            if (sort){
                Sort sort = new Sort(Sort.Direction.ASC,sortByColumn);
                return sort;
            }
            Sort sort = new Sort(Sort.Direction.DESC,sortByColumn);
            return sort;
        }
        return null;
    }
    提供相应的getter,setter
}

具体的query对象(以员工查询为例):

public class EmployeeQuery extends BaseQuery{
    private String username;
    private String email;
    private Integer age;
    private Long departmentId;
    @Override
    public Specification getSpecification() {
        Specification<Employee> spec = Specifications.<Employee>and()
                .like(StringUtils.isNotBlank(username),"username", "%"+username+"%")
                .like(StringUtils.isNotBlank(email),"email", "%"+email+"%")
                .ge(age !=null,"age",age)
                .eq(departmentId!=null,"departmentId.id",departmentId)
                .build();
        return spec;
    }
    getter,setter
}    

原文地址:https://www.cnblogs.com/kingofjava/p/10611863.html

时间: 2024-08-13 22:11:49

Spring Data Jpa之高级查询(jpa-spec插件)的相关文章

扩展Spring Data QBE支持范围查询

Spring Data JPA提供了Query by Example (QBE) 查询技术,实现了动态条件查询,不必再写烦琐的条件判断.但QBE不支持范围查询,本文结合QBE和Specification实现了动态范围查询. 本文以汪云飞-Spring Data JPA实现动态条件与范围查询实例代码为基础修改,利用org.springframework.data.domain.Range替换了自定义实现,支持Matching Any,保持了原代码的基本结构. 实现代码 FieldRange imp

spring data elasticsearch多索引查询

一次查询多个索引数据 es里可以这样写 GET 索引1,索引2,索引3/_search 也可以这样 给索引创建别名,多个索引可以使用一个别名 POST /_aliases { "actions": [ { "add": { "index": "myindex2", "alias": "myalias" } },{ "add": { "index":

Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring Data 和 Jpa! 本文大纲: 1. 故事的主角 1.1 Jpa 1.1.1 JPA 是什么 Java Persistence API:用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层 1.1.2 JPA 和 Hibernate 的关

JPA &amp;&amp; Spring Data JPA

1.JPA  Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范.因此各种ORM框架都会提供满足JPA要求的实现.在Spring项目中,ORM框架最常使用的就是Hibernate,Hibernate EntityManager就是JPA的一种provider. 2.Spring Data 尽管我们可以通过JPA规范

使用JAVA操作ElasticSearch(Java API 和Spring Data ElasticSearch)

Java API 我的ElasticSearch集群的版本是6.2.4,导入elasticsearch相关的maven依赖也是6.2.4,不同版本的api可能会有差异 一:maven依赖 <!--elasticsearch核心依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version

Spring Data ElasticSearch的使用十个小案例

1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能. 2.什么是Spring Data ElasticSearch Spring Data ElasticSearch 基于 spring data

Spring Data ElasticSearch的使用

1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能. 2.什么是Spring Data ElasticSearch Spring Data ElasticSearch 基于 spring data

Spring Data JPA 的 Specifications动态查询

主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询.相比JPQL,其优势是类型安全,更加的面向对象. import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import o

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

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot