解决jpa 使用query dsl关联查询时,关联同一张表两次的问题

参考:https://blog.csdn.net/zxl8876/article/details/84972047

 

QDqmIntegrity表中有tab,和tabRel 两个字段,关联的表都是QDqmTab表,此时需要关联QDqmTab表两次,才能同时得到tab、tabRel的翻译值;代码如下:

    /**
     * 完整性错误详情列表
     * 
     * @param tab
     * @param date
     * @param orgCode
     * @return
     */
    public Page<DqmIntegrityDto> getIntegrityDetailList(String tab, String tabRel, String date, String orgCode, Integer pageSize, Integer pageCurrent) {
        QDqmIntegrity qDqmIntegrity = QDqmIntegrity.dqmIntegrity;
        QDqmTab qDqmTab1 = new QDqmTab("qDqmTab1");
        QDqmTab qDqmTab2 = new QDqmTab("qDqmTab2");
        QDqmIntRule qDqmIntRule = QDqmIntRule.dqmIntRule;
        QSysOrg qSysOrg = QSysOrg.sysOrg;
        QBean<DqmIntegrityDto> bean = Projections.bean(DqmIntegrityDto.class, qDqmIntegrity.orgId, qSysOrg.id.orgName, qDqmIntegrity.tab, qDqmTab1.tabName.as("tabName"), qDqmIntegrity.mainKey, qDqmIntegrity.mainKeyValue, qDqmIntegrity.intRuleId, qDqmIntRule.intRule,
                qDqmIntRule.intDesc.as("intDesc"), qDqmIntegrity.upDate, qDqmIntegrity.tabRel, qDqmTab2.tabName.as("tabRelName"));
        JPAQuery<DqmIntegrityDto> jpaQuery = queryFactory.select(bean).from(qDqmIntegrity).leftJoin(qSysOrg).on(qDqmIntegrity.orgId.eq(qSysOrg.id.orgCode));
        jpaQuery.leftJoin(qDqmTab1).on(qDqmIntegrity.tab.eq(qDqmTab1.tab));
        jpaQuery.leftJoin(qDqmIntRule).on(qDqmIntegrity.intRuleId.eq(qDqmIntRule.id));
        jpaQuery.leftJoin(qDqmTab2).on(qDqmIntegrity.tabRel.eq(qDqmTab2.tab));
        jpaQuery.where(qDqmIntegrity.tab.eq(tab).and(qDqmIntegrity.tabRel.eq(tabRel)).and(qDqmIntegrity.upDate.eq(date)));
        if (CommonUtils.isNotEmpty(orgCode)) {
            jpaQuery.where(qDqmIntegrity.orgId.in(orgCode));
        }
        Long totalCount = jpaQuery.fetchCount();
        List<DqmIntegrityDto> list = jpaQuery.offset(pageCurrent).limit(pageSize).fetch();
        Page<DqmIntegrityDto> page = new Page<DqmIntegrityDto>(totalCount.intValue(), pageSize, pageCurrent, list);
        return page;
    }


关键点:
使用如下方式创建别名之后,关联时才能区分:
QDqmTab qDqmTab1 = new QDqmTab(“qDqmTab1”);
QDqmTab qDqmTab2 = new QDqmTab(“qDqmTab2”);
如果像下边这样只是创建了两个对象,却没使用别名,那么关联时不会区分,只引用其中一个,可通过看后台打印sql查看现象:
QDqmTab qDqmTab1 = QDqmTab.dqmTab;
QDqmTab qDqmTab2 = QDqmTab.dqmTab;
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值