天天看點

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 關聯查詢

繼續閱讀