1. 程式人生 > >Spring data jpa 多表查詢(二:多表動態條件查詢)

Spring data jpa 多表查詢(二:多表動態條件查詢)

上一章說完單表動態條件查詢,這章就說下多表關聯查詢

1、先說一對多關係,就以上一章的A模型和B模型,為例

A 對應 多個 B,而現在需求就是查詢A和B關聯,並需要傳入的動態引數,可能是A模型中的屬性,也有可能是B模型中的引數

還是用虛擬碼來說明,並且用的是Specification來查詢(上一章有說明)

public Page<A> findA(Pageable pageable,ADTO adto)

{

    //1.獲取adto裡面的動態引數,此時adto裡面,既有可能有A的屬性,也有B的屬性

String aName = adto.getAName();

String bName = adto.getBName();

   //2.宣告PredicateList

      List<Predicate> predicateList = new ArrayList<Predicate>();

     try...catch  省略

     Specification querySpecifi = new Specification<A>()

{

@Override

public Predicate toPredicate(Root root,CriteriaQuery criteriaQuery,CriteriaBuilder criteriaBuilder)

{

//上面的引數說明,在上一章已經解釋過,

            首先先建立關係,A和B的關係是一對多,並且通常都是左關聯,因此建立關係如下

Join<A,B>  BJoin = root.join("bList",JoinType.LEFT);

//這樣左關聯就已經建立起來了,下面解釋下上面的語句因為在A 模型中,定義了一個bList, 因此,root代表了A模型的根元素,因此,就是A 和 B 建立了左關聯聯絡,

也可以這樣寫:Join<A,B> BJoin = root.join(root.getModel().getList("bList",B.class),Join.LEFT);

這樣寫,就很全面點,root.getModel(),指的是A 模型的 元模型,元模型就是A模型的範例,等同於重新建立了一個類,叫A_,這個百度上可以搜的                               到,並且可以利用IDE,eclipse或者IDE自動生成這樣的類,而生成這樣類的作用,就是安全。此處不再細說。

上面定義後,等同於 sql語句:select (A模型裡面所有欄位屬性) from A left outer join B on a.id = B.a_id ,此時關係已經建立完成,接著就是怎麼帶入動態引數,

上面的BJoin,是代表 B ,因此如果是B的動態引數,即:criterialBuilder.equal(BJoin.get("bName"),bName), 當然我們通常名稱是模糊查詢,把equal 換成 like ,即:

criterialBuilder.like(BJoin.get(bName),"%"+bName+"%");   如果我還想再加一個A的引數,則直接用root,即:criterialBuilder.like(roo.get("aName"),"%"+aName+"%");

因為此方法查詢的主體是A,因此root 預設代表的就是A,最後將引數都新增到 predicatelist 當中

predicateList.add(criterialBuilder.equal(BJoin.get("bName"),"%"+bName+"%"));

predicateList.add(criterialBuilder.equal(root.get("aName"),"%"+aName+"%"));

return criteiralBuilder.and(predicateList.toArray(new Prediacate[predicateList.size()]));

}

Page<A> aPage = AReposity.findAll(querySpecifi,pageable);

}

總結:

如果上面的關係定義成這樣:Join<B,A>  AJoin = root.join("aId",Join.LEFT);  也可以,但是隻能是左連線關係或者預設的inner連線,right 連線會報錯的。

以上說的是,一多關係的連線和動態引數新增,下一章說的是,多對多關係動態引數新增

}