上一章说完单表动态条件查询,这章就说下多表关联查询


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)
{
//上面的参数说明,在上一章已经解释过,

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 连接会报错的。

以上说的是,一多关系的连接和动态参数添加,下一章说的是,多对多关系动态参数添加

}