左鏈接 和 右鏈接(left join right join) 使用注意點

本文不講左鏈接和右鏈接的區別.

簡單說就是 驅動表不一樣.

本文要說的是一種注意點是:

       如果你查詢的字段都是非驅動表的字段,這時要注意驅動表裏面有數據,而非驅動表裏面沒數據的情況.

如:

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.  希望減少大家採坑.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章