Spring Data JPA之動態查詢

2021-08-21 17:57:21 字數 4191 閱讀 2644

在日常工作中,spring data jpa的使用給我們帶來了極大的方便,但是實際業務中很多場景需要支援動態查詢。比如前端查詢功能提供了很多查詢條件,使用者可以根據一部分條件進行查詢,那麼後端就需要支援可配置的查詢服務。在使用mybatis等時,可以用動態查詢的方式輕鬆搞定,但是對於初次使用spring data jpa的小白來說,著實有些困難。本人也是在實際工作中參考資料,一步步摸索,掌握了一定的方法,現跟大家分享。

通過了解發現,spring data jpa是支援動態查詢的,需要我們的repo繼承jpaspecificationexecutor介面,使用的時候傳入相應引數即可。先看一下jpaspecificationexecutor介面:

public inte***ce jpaspecificationexecutor
其中,pageable是分頁查詢用的,sort是排序用的,比較簡單,先不做介紹,本次主要介紹specification。先看看它的定義:

public inte***ce specification
root是查詢的根物件,criteriabuilder可以用來構建查詢關係。下面以乙個例項來介紹具體使用:

下面是乙個儲存學生資訊的表t_student:

先構建一下查詢條件的引數體:

public class studentparam
查詢條件包含姓名、住址、學校、出生日期等。

看一下repo介面:

public inte***ce studentrepo extends crudrepository, jpaspecificationexecutor,

pagingandsortingrepository

業務實現**:

public listquerystudent(final studentparam studentparam) 

if (studentparam.getstartdate() != null && !"".equals(studentparam.getstartdate()))

if (studentparam.getenddate() != null && !"".equals(studentparam.getenddate()))

return cb.and(predicates.toarray(new predicate[predicates.size()]));}};

liststudententities = studentrepo.findall(specification);

liststudents = new arraylist();

for (studententity studententity : studententities)

return students;

}

說明:以其中一行**:predicates.add(cb.equal(root.get("name"), studentparam.getname()));為例。"name"指定了實體的其中乙個屬性,studentparam.getname()是傳入的姓名引數值,equal指的是等於。此段**的含義是where條件,如:name='張三'。注意指定的屬性名必須與查詢實體的屬性名一致,否則會報錯。

測試**:

@test

public void querystudenttest()

}

執行結果: 

hibernate: 

select

studentent0_.id as id1_0_,

studentent0_.address as address2_0_,

studentent0_.birthday as birthday3_0_,

studentent0_.name as name4_0_,

studentent0_.school as school5_0_,

studentent0_.tel as tel6_0_

from

t_student studentent0_

where

studentent0_.name=?

and studentent0_.birthday>?

and studentent0_.birthday

student

student

student

在執行中,我們發現spring data jpa根據配置的查詢條件自動生成了條件語句:where

studentent0_.name=?

and studentent0_.birthday>?

and studentent0_.birthday

上例中,將查詢條件通過and關聯起來,進一步,如果我們需要用的or,該如何實現?看下面:

public listquerystudent(final studentparam studentparam) 

if (studentparam.getstartdate() != null && !"".equals(studentparam.getstartdate()))

if (studentparam.getenddate() != null && !"".equals(studentparam.getenddate()))

//定義or的條件陣列

listorpredicates = new arraylist();

if (studentparam.getschool() != null && !"".equals(studentparam.getschool()))

if (studentparam.getaddress() != null && !"".equals(studentparam.getaddress()))

//生成or的查詢表示式

predicate orpredicate = cb.or(orpredicates.toarray(new predicate[orpredicates.size()]));

//與and結合起來

predicates.add(orpredicate);

return cb.and(predicates.toarray(new predicate[predicates.size()]));}};

liststudententities = studentrepo.findall(specification);

liststudents = new arraylist();

for (studententity studententity : studententities)

return students;

}

測試**:

@test

public void querystudenttest()

}

執行結果:

hibernate: 

select

studentent0_.id as id1_0_,

studentent0_.address as address2_0_,

studentent0_.birthday as birthday3_0_,

studentent0_.name as name4_0_,

studentent0_.school as school5_0_,

studentent0_.tel as tel6_0_

from

t_student studentent0_

where

studentent0_.name=?

and studentent0_.birthday>?

and studentent0_.birthday

and (

studentent0_.school=?

or studentent0_.address=?

)student

spring data jpa 支援的動態查詢也非常強大,實際工作中可以根據情況靈活配置。希望我的分享能給需要的朋友一點幫助,不足之處,敬請斧正。

Spring Data JPA之刪除和修改

一 分頁查詢 因為pagingandsortingrepository,我們總是可以傳入sort和pageable對查詢結果進行排序和分頁 支援命名查詢 example查詢和query查詢 當查詢方法中有多個引數的時候,pageable sort建議做為最後乙個引數傳入 query select u...

spring data jpa實體繼承

spring jpa中我們要將sql對映到物件,尤其是在spring boot這種高度自動化的環境下使用,大量的最優目錄結構與命名規則可以大大降低配置,約定大於配置貫穿其中。例如我們定義查詢dao,繼承jparepository即可。然後返回的物件,我們可以定義model entity table ...

SpringData JPA分頁查詢

首先我們需要知道springdata jpa 的幾個介面 其實看名字就大概懂了,也可以很方便的使用 首先我們的持久化層繼承jparepository,相當於繼承了增刪改查的持久化層以及分頁查詢的持久化層 所以如果我們要使用分頁查詢 我們只需要直接呼叫 由一開始的圖也可以看到pageable的其中乙個...