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 JPA之JPA應用詳解(自定義查詢及複雜查詢)
在此,對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層: 方