天天看点

8. fluent-mybatis 关联查询

作者:EYE33
  1. 2张表innerJoin + order by
public void innerJoinQuery(){
        //单表查询时 不指定select的字段 默认为selectAll
        //关联查询时 不指定select字段 则没有默认的字段 必须指定需要查询的字段
        //关联时 where 条件跟在各自表Query后 
        TestDeptQuery queryA = TestDeptQuery.emptyQuery().select.deptName().deptId().end();
        TestCompanyQuery queryB = TestCompanyQuery.emptyQuery().selectAll();

        JoinQuery joinQuery = JoinBuilder.from(queryA)
                .join(queryB).on(a -> a.where.companyId(), b -> b.where.companyId()).endJoin()
                .build();

        joinQuery.orderBy.desc(TestCompanyMapping.companyId).end();
        //任意一个mapper接口 执行关联查询
        //listEntity 是自己扩展的方法 可以指定查询结果映射成任意实体对象 或者 json对象
        List<JSONObject> list = companyMapper.listEntity(joinQuery, JSONObject.class);
        int i = 0;

    }           
2023-08-03 22:42:56.988 [http-nio-6443-exec-2] [f78a7a30-209a-46b2-b714-805dbda70275] [192.168.3.8] INFO  com.project.global.interceptor.MybatisInterceptor intercept 72 - 
id:com.project.mybatis.busi.mapper.TestCompanyMapper.listMaps,执行sql耗时:47 ms
完整SQL信息:
SELECT a_1.`DEPT_NAME`, a_1.`DEPT_ID`,
a_2.`COMPANY_ID`, a_2.`COMPANY_NAME`, a_2.`CREATE_TIME`, a_2.`UPDATE_TIME` 
FROM `test_dept` a_1 
JOIN `test_company` a_2 
ON a_1.`COMPANY_ID` = a_2.`COMPANY_ID` 
ORDER BY `COMPANY_ID` DESC
           

从日志中可以看出,执行查询时,自动加了表的别名

8. fluent-mybatis 关联查询
  1. 3张表的left join ,且自定义别名+ 自由关联 + order by

在JoinQuery中,默认的on关联 都是from的表 去关联leftJoin的表

如果需要一个leftJoin的表 去关联另外一个leftJoin的表 则需要自定义表的别名 并使用onApply手写关联字段,并指定字段所属表的别名

public void leftJoinQuery(){
        Long testCompanyId = 12L;

        TestEmployeeQuery queryA = TestEmployeeQuery.emptyQuery("a").select.name().end();
        TestDeptQuery queryB = TestDeptQuery.emptyQuery("b").select.deptName().deptId().end();
        TestCompanyQuery queryC = TestCompanyQuery.emptyQuery("c")
                .select.companyName().companyId().end()
                .where
                //可以动态判定参数状态后 再决定是否拼接 where条件
                .companyId().eq(testCompanyId, If::notNull)
                .end();

        JoinQuery joinQuery = (JoinQuery) JoinBuilder.from(queryA)
                //on 第1个参数是from表 第2个参数是leftJoin的表
                .leftJoin(queryB).on(a -> a.where.deptId(),b -> b.where.deptId()).endJoin()
                //如果需要 自由定义那个表的A字段和哪个表的A字段关联 可以使用onApply 注意要加上自定义的别名
                .leftJoin(queryC).onApply("b.COMPANY_ID = c.COMPANY_ID").endJoin()
                .build()
                ;

        joinQuery.orderBy.desc(TestCompanyMapping.companyId).end();
        List<JSONObject> list = companyMapper.listEntity(joinQuery, JSONObject.class);
        int i = 0;
    }           
2023-08-03 23:11:51.036 [http-nio-6443-exec-3] [055faff2-6dd4-4931-bca5-b7cdabbc28b3] [192.168.3.8] INFO  com.project.global.interceptor.MybatisInterceptor intercept 72 - 
id:com.project.mybatis.busi.mapper.TestCompanyMapper.listMaps,执行sql耗时:41 ms
完整SQL信息:
SELECT a.`NAME`, 
b.`DEPT_NAME`, b.`DEPT_ID`, 
c.`COMPANY_NAME`, c.`COMPANY_ID` 
FROM `test_employee` a 
LEFT JOIN `test_dept` b ON a.`DEPT_ID` = b.`DEPT_ID` 
LEFT JOIN `test_company` c ON b.COMPANY_ID = c.COMPANY_ID 
WHERE c.`COMPANY_ID` = 12 ORDER BY `COMPANY_ID` DESC
           
8. fluent-mybatis 关联查询

继续阅读