mybatis and和or組合查詢問題

2021-09-27 07:18:31 字數 2456 閱讀 8984

p.name as keepername,p.idcard, p.*** as keeper***, p.residenceaddr, o.orgname as operatororgname

from t_dogm_dog_certchange c

left join t_combo_person p on c.personid = p.personid

left join t_combo_org o on c.operatororgid = o.orgid

and c.projectid =#

and c.dogcertno like concat('%',#,'%')

or c.oldcertno like concat('%',#,'%')

and p.name like concat('%',#,'%')

limit #, #

要求就是頁面查詢的時候輸入任意犬證號,後台查詢去匹配原犬證號和新犬證號

測試發現上面寫法有問題:表中只存在小明,頁面上同時輸入姓名、犬證號,竟然也查出兩條資料,sql語句不是並且的關係

問題的關鍵就在於and和or的執行順序問題,and的優先順序大於or,上面**相當於:

select c.id, c.personid, c.dogcertno, c.oldcertno, c.deveui, c.reason, c.operator, c.operatororgid, c.operateret, c.optime, c.projectid, c.remark, 

p.name as keepername,p.idcard, p.*** as keeper***, p.residenceaddr, o.orgname as operatororgname

from t_dogm_dog_certchange c

left join t_combo_person p on c.personid = p.personid

left join t_combo_org o on c.operatororgid = o.orgid

where 1=1

and (c.projectid ='t20190906p1001' and p.name like '%好%' and c.dogcertno like '%1%') or (c.oldcertno like '%1%')

limit 0, 10

只要c.oldcertno like '%1%'成立就可以了,

所有原sql要修改為:

select c.id, c.personid, c.dogcertno, c.oldcertno, c.deveui, c.reason, c.operator, c.operatororgid, c.operateret, c.optime, c.projectid, c.remark, 

p.name as keepername,p.idcard, p.*** as keeper***, p.residenceaddr, o.orgname as operatororgname

from t_dogm_dog_certchange c

left join t_combo_person p on c.personid = p.personid

left join t_combo_org o on c.operatororgid = o.orgid

where 1=1

and c.projectid ='t20190906p1001' and p.name like '%好%' and (c.dogcertno like '%1%' or c.oldcertno like '%1%')

limit 0, 10

測試查詢結果符合要求! 

繼承和組合

繼承是一種白箱復用,父類的內部細節對子類可見。物件組合彼此不知道對方內部細節,成為黑箱復用。繼承的優缺點 1 子類可以直接重定義父類的操作。2 編譯時刻決定了,無法在執行期間更改。3 子類要知道父類的實現細節,這樣就部分破壞了封裝性。子類和父類依賴過於緊密,父類的某些變化必然導致子類的變化。開發過程...

繼承和組合

1.相同點 二者都是實現類重用的重要方式。2.不同點 繼承會破壞封裝性。例 class a public void breath class b extends a class c extends a 則b,c物件則能夠訪問a中的public方法和屬性,在一定程度上破壞了類的封裝性。使用組合的方法如...

排列和組合

排列組合計算公式 排列a n,m n n 1 n m 1 n!n m n為下標,m為上標,以下同 組合c n,m a n,m a m,m n!m!n m 問題 從1到n 包含 中選出m n個數,在下列情況下,有多少種組合?限制條件 1 無限制 2 各位數字公升序排列 3 不能有重複數字 4 各位數字...