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

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


}

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值