jpa 跨表 JPA的多表複雜查詢

2021-10-18 06:24:54 字數 3515 閱讀 9222

最近工作中由於要求只能用hibernate+jpa 與資料庫進行互動,在簡單查詢中,jpa繼承crudrepository介面 ,然後利用jpa的方法命名規範進行jpql查詢,然而在進行複雜查詢時,需要繼承jpaspecificationexecutor介面 利用specification 進行複雜查詢,由於我自己就遇到了這一問題,查了好多資料,雖然有方法,但是都沒有乙個詳細的講解,以至於知道方法而不能很好的利用jpa複雜查詢的方便之處。我將舉幾個栗子,來詳細的說一下我自己在使用jpa多表複雜查詢的場景和想法。

栗子1:

以乙個實體類user中的幾個屬性進行篩選。

1. 名字

2. id

3. 手機號

這是乙個單錶的多條件複雜查詢,由於是在幾個屬性中進行篩選,其中的屬性的個數不知道有多少個,所以只需要利用specification 查詢就可以很方便的實現這個需求。 下面請看**:

場景:頁面上通過條件篩選,查詢使用者列表

這裡有3個條件 在頁面上我設定的id分別為searchname,searchid,searchmobile。 由於這個是user表 所以userrepository 繼承jpaspecificationexecutor介面,隨後我建立了乙個封裝條件的類

public class pageparam , fetch = fetchtype.lazy)

@joincolumn(name = "actorid")

@org.hibernate.annotations.foreignkey(name = "none")

list livings = new arraylist<>();

@onetoone(cascade = , fetch = fetchtype.lazy)

@org.hibernate.annotations.foreignkey(name = "none")

@joincolumn(name = "userdetailid", foreignkey = @foreignkey(name = "none", value = constraintmode.no_constraint))

userdetail userdetail;

@column(nullable = false)

@enumerated(value = enumtype.ordinal)

actortype actortype = actortype.a;

public enum actortype, fetch = fetchtype.lazy)

@org.hibernate.annotations.foreignkey(name = "none")

@joincolumn(name = "actorid", foreignkey = @foreignkey(name = "none", value = constraintmode.no_constraint))

actor actor;

string truename;

public class region , fetch = fetchtype.lazy)

@joincolumn(name = "regionid")

@org.hibernate.annotations.foreignkey(name = "none")

list livings;

現在要根據userdetai 種的 *** actor中的actortype 還有 region的id 為條件查詢出滿足條件的living。

public class pageparam {

private integer pagesize = 10;

private integer pagenumber = 1;

private *** ***;

private actortype actortype;

private long cityid;

首先我還是封裝了這樣乙個類,但是這裡的泛型 我是直接給到了想要的查詢結果的泛型,接下來 因為這裡涉及到了乙個 多表的查詢 所以上面的單錶查詢的例子 已經不適合這個查詢了,但是criteria 的join方法 給我們提供了乙個模式

specification specification = new specification() {

@override

public predicate topredicate(root root, criteriaquery> query, criteriabuilder cb) {

list list = new arraylist();

if (null!=***) {

join join = root.join("actor", jointype.left);

list.add(cb.equal(join.get("userdetail").get("***"), *** ));

if (null!=actortype) {

join join = root.join("actor", jointype.left);

list.add(cb.equal(join.get("actortype"), actortype));

if (null!=cityid) {

join join = root.join("region", jointype.left);

list.add(cb.equal(join.get("id"), cityid));

//join join = root.join("bs", jointype.left);

"c").get("id"), id));

predicate p = new predicate[list.size()];

return cb.and(list.toarray(p));

這裡是我對條件進行的封裝。jpa 的多條件查詢 主要是根據criteria 為我們提供的方法封裝條件,然後根據 給條件定義的位置,再生成sql語句,之後完成查詢。

不得不說的地方,在這個多表的查詢中以下面這句為例

join join = root.join("actor", jointype.left);

list.add(cb.equal(join.get("userdetail").get("***"), *** ));

jointype.left主要是說最終的這個屬性 是在哪個表中, 而前面的 「actor」 則表示 從living表中 查詢的 第一步的查詢,比如我給出的例子 是要查詢出 living 中的 actor 然後是actor 中的userdetail 之後才是 userdetail中的 ***屬性 所以下面的join.get(「userdetail」).get(「***」) ,這裡就是get出相應的屬性,一直到你得到想要的屬性為止。 接下來的兩個屬性 也同理,

許多人多jpa 有很大的誤解,認為jpa 的多表,多條件複雜查詢,不如mybatis的查詢,在之前我也是這麼覺得,但自從通過jpa 實現了這個多表多條件的複雜查詢之後,我覺得hibernate的複雜查詢 不遜於mybatis ,尤其是對sql 語句不是很精通的 碼農,雖然hibernate的門檻較高可jpa 恰恰降低了hibernate 所需要的門檻,希望大家可以通過我的經驗,更方便的與資料庫進行互動。

JPA的多表複雜查詢

以乙個實體類user中的幾個屬性進行篩選。名字id 手機號這是乙個單錶的多條件複雜查詢,由於是在幾個屬性中進行篩選,其中的屬性的個數不知道有多少個,所以只需要利用specification 查詢就可以很方便的實現這個需求。下面請看 場景 頁面上通過條件篩選,查詢使用者列表 這裡有3個條件 在頁面上我...

Jpa多表查詢

作業題目 api 商品列表 get sell buyer product list引數無 返回 建立訂單 post sell buyer order create 引數返回 訂單列表 get sell buyer order list 引數openid 18eu2jwk2kse3r42e2e pag...

JPA的複雜查詢Specification

使用springdatajpa做複雜查詢的時候 需要在實體的repository中繼承乙個 public inte ce nurseforumrepository extends baserepository,jpaspecificationexecutor在業務邏輯service層中 pagere...