jpa多表关联条件查询实现

通过实体类映射实现多表关联条件查询

jpa对于多表关联可以在实体类中进行关联映射,一对一用@OneToOne,一对多用@OneToMany,多对多用@ManyToMany,多对一用@ManyToOne,具体实体类配置就不多说了,然后对于条件查询采用Specification对象进行封装,如下

Specification<A> specification = new Specification<A>() {
        @Override
        public Predicate toPredicate(Root<A> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            //创建查询条件集合
            List<Predicate> orlist = new ArrayList<Predicate>();
            //判断是否模糊查询
            if (StringUtils.isNotBlank(key)){
                //添加查询条件  cb.like:模糊查询   root.get("查询字段").as(类型.class)
                orlist.add(cb.like(root.get("name").as(String.class),"%"+  key + "%"));
                orlist.add(cb.like(root.get("phone").as(String.class), "%"+  key + "%"));
                orlist.add(cb.like(root.get("role").as(String.class),"%"+  key + "%"));
                //创建左外连接  Join<左,右>     root.join("副表实体在主表主体中的属性名",连接方式)
                Join<A,B> join = root.join("b", JoinType.LEFT);
                //将连接表需要查询的字段写入
                orlist.add(cb.like(join.get("post").as(String.class),"%"+key+"%"));
            }
            return  cb.or(orlist.toArray(new Predicate[orlist.size()]));
        }
    };

通过@Query(value=“sql语句”)方式实现表关联查询

创建ARepository接口然后继承JpaRepository和JpaSpecificationExecutor,然后在repository接口中编写查询方法,如下

public interface ARepository extends JpaRepository<A,String> , JpaSpecificationExecutor<A> {

	@Query(value="SELECT * " +
            "FROM A_table a " +
            "LEFT JOIN B_table b ON a.b_unid = b.unid " +
            "LEFT JOIN C_table c ON a.c_unid = c.unid " +
            "WHERE a.delete_flag = 0 " +
            "AND (?1 is null or ?1='' or a.b_unid = ?1 )" +
            "AND (?2 is null or ?2='' or a.c_unid = ?2 ) " +
            "AND (?3 is null or ?3='' or a.created_time >= ?3 ) " +
            "ORDER BY fqcm.created_time DESC",nativeQuery = true)
    List<Map> selectABC(String bUnid, String cUnid, String createdTimeStart);
 }

@Query中?!,?2,?3代表传递的参数,应和下边方法中的参数顺序保持一致,其中条件

AND (?1 is null or ?1='' or a.b_unid = ?1 )

表示参数如果为空字符串或者null时条件不生效,不为空字符串和null时条件生效。
nativeQuery = true 表示可以执行原生的sql语句。

结束语

以上是自己在做jpa多表关联是使用的方法,做一下记录。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值