1. 程式人生 > >spring data jpa 利用JpaSpecificationExecutor做複雜查詢

spring data jpa 利用JpaSpecificationExecutor做複雜查詢

spring data jpa 通過建立方法名來做查詢,只能做簡單的查詢,那如果我們要做複雜一些的查詢呢,多條件分頁怎麼辦,這裡,spring data jpa為我們提供了JpaSpecificationExecutor介面,只要簡單實現toPredicate方法就可以實現複雜的查詢

1.首先讓我們的介面繼承於JpaSpecificationExecutor

public interface TaskDao extends JpaSpecificationExecutor<Task>{

}

2.JpaSpecificationExecutor提供了以下介面

public interface JpaSpecificationExecutor<T
> { T findOne(Specification<T> spec); List<T> findAll(Specification<T> spec); Page<T> findAll(Specification<T> spec, Pageable pageable); List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec); }

其中Specification就是需要我們傳進去的引數,它是一個介面


public interface Specification<T> {

    Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}

2.接下來我們在service bean

@Service
public class TaskService {

    @Autowired TaskDao taskDao ;


    /**
     * 複雜查詢測試
     * @param
page * @param size * @return */
public Page<Task> findBySepc(int page, int size){ PageRequest pageReq = this.buildPageRequest(page, size); Page<Task> tasks = this.taskDao.findAll(new MySpec(), pageReq); return tasks; } /** * 建立分頁排序請求 * @param page * @param size * @return */ private PageRequest buildPageRequest(int page, int size) { Sort sort = new Sort(Direction.DESC,"createTime"); return new PageRequest(page,size, sort); } /** * 建立查詢條件 * @author liuxg * @date 2016年3月30日 下午2:04:39 */ private class MySpec implements Specification<Task>{ @Override public Predicate toPredicate(Root<Task> root, CriteriaQuery<?> query, CriteriaBuilder cb) { //1.混合條件查詢 /*Path<String> exp1 = root.get("taskName"); Path<Date> exp2 = root.get("createTime"); Path<String> exp3 = root.get("taskDetail"); Predicate predicate = cb.and(cb.like(exp1, "%taskName%"),cb.lessThan(exp2, new Date())); return cb.or(predicate,cb.equal(exp3, "kkk")); 類似的sql語句為: Hibernate: select count(task0_.id) as col_0_0_ from tb_task task0_ where ( task0_.task_name like ? ) and task0_.create_time<? or task0_.task_detail=? */ //2.多表查詢 /*Join<Task,Project> join = root.join("project", JoinType.INNER); Path<String> exp4 = join.get("projectName"); return cb.like(exp4, "%projectName%"); Hibernate: select count(task0_.id) as col_0_0_ from tb_task task0_ inner join tb_project project1_ on task0_.project_id=project1_.id where project1_.project_name like ?*/ return null ; } } }

3.實體類task程式碼如下

@Entity
@Table(name = "tb_task")
public class Task {

    private Long id ;
    private String taskName ;
    private Date createTime ;
    private Project project;
    private String taskDetail ;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "task_name")
    public String getTaskName() {
        return taskName;
    }
    public void setTaskName(String taskName) {
        this.taskName = taskName;
    }

    @Column(name = "create_time")
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }


    @Column(name = "task_detail")
    public String getTaskDetail() {
        return taskDetail;
    }
    public void setTaskDetail(String taskDetail) {
        this.taskDetail = taskDetail;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "project_id")
    public Project getProject() {
        return project;
    }
    public void setProject(Project project) {
        this.project = project;
    }

}

通過重寫toPredicate方法,返回一個查詢 Predicate,spring data jpa會幫我們進行查詢。

也許你覺得,每次都要寫一個類來實現Specification很麻煩,那或許你可以這麼寫

public class TaskSpec {

    public static Specification<Task> method1(){

        return new Specification<Task>(){
            @Override
            public Predicate toPredicate(Root<Task> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                return null;
            }

        };
    }

    public static Specification<Task> method2(){

        return new Specification<Task>(){
            @Override
            public Predicate toPredicate(Root<Task> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                return null;
            }

        };
    }

}

那麼用的時候,我們就這麼用

Page<Task> tasks = this.taskDao.findAll(TaskSpec.method1(), pageReq);

JpaSpecificationExecutor的介紹就到這裡,下次再看看怎麼通過寫hql或者sql語句來進行查詢

相關推薦

spring data jpa 利用JpaSpecificationExecutor複雜查詢

spring data jpa 通過建立方法名來做查詢,只能做簡單的查詢,那如果我們要做複雜一些的查詢呢,多條件分頁怎麼辦,這裡,spring data jpa為我們提供了JpaSpecificationExecutor介面,只要簡單實現toPredicate方

spring data jpa 實現多條件複雜查詢及多表聯查

最近發現JPA在處理單表時,很方便,但多表就比較複雜了。今天寫一下端午這兩天琢磨的多條件查詢,還有多表聯查。文章比較長,大部分都是程式碼,不願意看的程式碼copy下去,直接可以實現;想交流的可以看完,然後留言交流。maven依賴啊,配置,繼承寫法等知識點不展開說了,之前寫過一

SpringBoot中使用Spring Data Jpa 實現簡單的動態查詢的兩種方法

ppr eat value table 得到 blog .net ride integer 首先謝謝大佬的簡書文章:http://www.jianshu.com/p/45ad65690e33# 這篇文章中講的是spring中使用spring data jpa,使用了xml配

spring data jpa 多表UNION ALL查詢按條件排序分頁處理:未搜到方法,解決後記錄:2018年11月13日15:22:00

需求:Mysql資料庫 有不同屬性的兩張表,需要進行按某個條件查詢,結果合併排序分頁。 讓產品把兩個表分成兩段展示各查各的,分開來。 產品經理說能實現:產品寫sql 聯合查詢, A UNION AL

spring data jpa】帶有條件的查詢後分頁和不帶條件查詢後分頁實現

一.不帶有動態條件的查詢 分頁的實現  例項程式碼: controller:返回的是Page<>物件 @Controller@RequestMapping(value = "/egg")  publicclass EggController {   @

Spring data JPA使用Specification實現動態查詢例子

實體類 package com.net263.domain; import java.math.BigDecimal; import java.util.Date; import javax.persistence.Column; import jav

Spring Data JPA 實現多表關聯查詢

多表查詢在spring data jpa中有兩種實現方式,第一種是利用hibernate的級聯查詢來實現,第二種是建立一個結果集的介面來接收連表查詢後的結果,這裡介紹第二種方式。 一、一對一對映 實體 UserInfo :使用者。 實體 Address

Spring Data JPA複雜查詢

在使用Spring Data JPA框架時,可以按照符合框架規則的自定義方法或@Query進行固定條件查詢。如果是動態條件查詢框架也提供了介面。 public interface JpaSpecificationExecutor<T> 1.符合框架規則的自定義方法:

Spring data JPA 的分頁功能及複雜語句查詢

測試的資料表 // 實體類 @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name="demo_user") public class DemoUser { @Id @Gener

SpringBoot第二講利用Spring Data JPA實現資料庫的訪問(二)_分頁和JpaSpecificationExecutor介面介紹

我們繼續研究spring jpa data,首先看看分頁和排序的實現,在原來的程式碼中,我們如果希望實現分頁,首先得建立一個Pager的物件,在這個物件中記錄total(總數),totalPager(總頁數),pageSize(每頁多少條記錄),pageInde

【系統學習SpringBoot】再遇Spring Data JPAJPA應用詳解(自定義查詢複雜查詢

在此,對Spring Data Jpa做詳細的筆記(使用層面的,原理層日後再說哈哈。) 一、Spring Data JPA設定建立方式: 建立方式一共分為四種: #配置資料庫,使用SpringJPA spring: datasource:

Spring Data JPA 複雜/多條件組合查詢

1: 編寫DAO類或介面  dao類/介面 需繼承 publicinterface JpaSpecificationExecutor<T>          介面;        如果需要分頁,還可繼承   publicinterface Pa

Spring data jpa 複雜動態查詢方式總結

一.Spring data jpa 簡介 首先我並不推薦使用jpa作為ORM框架,畢竟對於負責查詢的時候還是不太靈活,還是建議使用mybatis,自己寫sql比較好.但是如果公司用這個就沒辦法了,可以學習一下,對於簡單查詢還是非常好用的.     首先JPA是Java

spring-data-jpa 介紹 複雜查詢,包括多表關聯,分頁,排序

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇

Spring Data JPA 實例查詢

customer 數據庫表 查詢方式 記錄 如何 三、認識“實例查詢” 1、概念定義: 上面例子中,是這樣創建“實例”的:Example<Customer> ex = Example.of(customer, matcher);我們看到,Example對象,由custom

Spring Data JPA動態查詢(多條件and)

ica cat 滿足 from pos true ans let tid entity: @Entity @Table(name = "data_illustration") public class Test { @Id @Gen

Spring Data JPA 多個實體類表聯合視圖查詢

test where part 左連接 lec 視圖 view new manytoone Spring Data JPA 查詢數據庫時,如果兩個表有關聯,那麽就設個外鍵,在查詢的時候用Specification創建Join 查詢便可。但是只支持左連接,不支持右連接,雖說左

Spring Boot中使用Spring-data-jpa實現分頁查詢(轉)

分頁查詢 log def inpu database ext identity odin btn 在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那麽我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。 1、引入起步依賴

spring-data-jpa快速入門(二)——簡單查詢

ref spa data mail domain event cif open 寫實 一、方法名解析   1.引言     回顧HelloWorld項目中的dao接口 public interface GirlRepository extends JpaRepos

模糊查詢Spring Data JPA 如何進行模糊查詢(LIKE) ?

定義 repos ppi -- data art dao層 sql語句 pos 原文詳見-----> https://blog.csdn.net/czx1204/article/details/79131281 一. 方法一 1. Controller層: 方