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 連線會報錯的。
以上說的是,一多關係的連線和動態引數新增,下一章說的是,多對多關係動態引數新增
}