在日常工作中,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的其中乙個...