Spring Data JPA QueryDSL 多表联合查询

12 篇文章 0 订阅
5 篇文章 0 订阅

很多时候表与表之间是有关系的,比如一对一 一对多等等,也有的没有建立起 关系只是存了主键id 。

此时多表查询可以使用left join

代码如下:

        QUser qUser = QUser.user;
        QStudent qStudent = QStudent.student;
        String userName = "张三";
        String bloodType = "AB";
        Predicate predicate = qUser.id.isNotNull().or(qUser.isNull());
        predicate = StringUtils.isEmpty(userName) ? predicate : ExpressionUtils.and(predicate, qUser.name.eq(userName));
        predicate = StringUtils.isEmpty(bloodType) ? predicate : ExpressionUtils.and(predicate, qStudent.bloodType.eq(bloodType));

        //连表查询
        List<UserStudentDTO> userStudentDTOList = jpaQueryFactory.select(
                Projections.bean(
                        UserStudentDTO.class,
                        qUser.address.as("address2"),
                        qStudent.birthday
                )
        )
                .from(qUser)
                .leftJoin(qStudent)
                .on(qUser.id.eq(qStudent.id))
                .where(
                        predicate,
                        qStudent.isdelete.eq(false),
                        qUser.isdelete.eq(false)
                )
                .fetch();

执行的sql:

Hibernate: 
    select
        user0_.address as col_0_0_,
        student1_.birthday as col_1_0_ 
    from
        smms_user user0_ 
    left outer join
        smms_student student1_ 
            on (
                user0_.id=student1_.id
            ) 
    where
        (
            user0_.id is not null 
            or user0_.id is null
        ) 
        and user0_.name=? 
        and student1_.blood_type=? 
        and student1_.isdelete=? 
        and user0_.isdelete=?

然后看下集合中的值:

Predicate可以创建动态的查询条件,不需要的话也可以直接在where中写
Projections是自定义返回对象的

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值