本文不講左鏈接和右鏈接的區別.
簡單說就是 驅動表不一樣.
本文要說的是一種注意點是:
如果你查詢的字段都是非驅動表的字段,這時要注意驅動表裏面有數據,而非驅動表裏面沒數據的情況.
如:
select
x.a,
x.b,
x.c ----- 你查詢的字段都是 非驅動表的字段.
from x x
right join y y
on x.id = y.id
where y.id = 1
--- 如果 y.id = 1, 在y表裏存在,而在x表裏不存在數據.
--- 這是查詢的結果是 所有列都爲null.
--- 但是在java 接收時要注意.
java dao 層如果用list<T>接收.
在 service 層 業務處理的時候,要注意:
// 例如 dao 層
List<dto> querySth();
// service 層
List<dto> list = dao.querySth();
// 這時候要注意, 雖然 查詢出來所有字段都是 null.
// 但是 list 並不是null, list.size() 是不等於 0 的.
// 這是一個大坑.
list.size(); // size 是等於1的. 查詢的結果爲: list[null].
// 所以你在下面 做業務處理時, 如果遍歷這樣寫,就會報nullpointexcption.
if(null != list && list.size() > 0) {
for(dto d: list) {
.....
}
}
// 這是,你的if 是沒有校驗住, 裏面遍歷的時候會報 空指針異常.
// 一定要注意這個坑.
這個坑要怎麼避免呢.
首先可以從sql層面去避免, 查詢字段中最好有 驅動表的字段,讓它查詢出不是 null;
或者對 null 做處理. 比如:
select
y.id, -- 保證驅動表有數據能查出來
x.a,
ifnull(x.b, '自定義') b, -- 或者對null 做處理
x.c
from x x
right join y y
on x.id = y.id
where y.id = 1
其次就是在 java 中, 對以上 null 做處理. 這裏省略.
---end. 希望減少大家採坑.