- 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
從日志中可以看出,執行查詢時,自動加了表的别名
- 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