mysql - mybatis select語句問題
問題描述
消息提醒續,這個消息可能是別人直接回復了你的文章,這時需要進行數據庫操作關聯文章表獲取相應文章的內容【消息提醒:您的文章xxx有了新的回復】,也可能是別人回復了你的評論這時關聯的就是評論表來獲取評論的內容【消息提醒:您的評論xxx有了新的回復】,消息點擊后即可出現顯示詳情這樣子。
數據庫表結構如下
mbelongbid為消息所屬的文章的id,mbelongcid為消息所屬的評論的id。當mbelongcid為空時說明消息是直接回復文章,此時關聯的是文章表;當mbelongcid不為空時說明消息回復的對象是某一條評論,此時關聯的是評論表。
sql語句要怎么寫才能符合這種需求?現在的想法是:
select
r.*, <if test='mbelongcid == null'>`blog`.btitle</if><if test='mbelongcid != null'>`comment`.ccontent</if>
from (
select mid, mreferuid, mbelongbid, mbelongcidfrom messagewhere mid = #{_parameter}
)r, <if test='mbelongcid == null'>
`blog` where r.mbelongbid = `blog`.bid
</if> <if test='mbelongcid != null'>
`comment` where r.mbelongcid = `comment`.cid
</if>
直接這樣寫是有問題的,大致的想法就是根據mbelongcid是否為null去關聯不同的表獲取不同的字段,有沒有好的解決方案或者建議?
問題解答
回答1:mbelongcid不是你傳入的參數的一部分,所以mybatis并不知道它到底是不是null!,你要實現你想要的這種邏輯應該從數據庫端去著手,比如創建一個視圖,這個視圖由兩個查詢union而成。
select mid, mreferuid, ’blog’ as type, mbelongbid as ridfrom message m, blog bwhere mbelongcid is null and mbelongbid is not null and mbelongbid = b.bidunionselect mid, mreferuid, ’comment’ as type, mbelongcid as ridfrom message m, comment cwhere mbelongcid is not null and mbelongcid = c.cid
當你寫程序遇到這種需要很奇怪的語法的時候,請先回顧一下設計方案,通常緣由都是設計就有問題。
數據表誰設計的?扣工資 至少要加個下劃線啊m_belong_cid,學生黨,慢慢來吧。
回答2:我們項目用的是注解式SQL,遇到這類情況都是直接在Provider拼SQL解決。
回答3:MessageMapper.xml這部分的語句如下:
message類如下:
相關文章:
1. 數組按鍵值封裝!2. docker不顯示端口映射呢?3. java - 阿里的開發手冊中為什么禁用map來作為查詢的接受類?4. javascript - 使用vue官方腳手架進行單元測試,如何覆蓋到watch里的變量?5. javascript - 為什么創建多行多列的表格最后只有一行內有表格6. 如何用Java向kafka發送json數據7. javascript - webpack中alias配置中的“@”是什么意思?8. clone - git sourceTree克隆倉庫時,都不停彈出Password Required彈窗,即時輸入正確的git賬號密碼還是彈出9. 主題切換問題,用過別人的webapp在后臺切換模板主題后手機端打開網頁就是切換到的主題了10. html5 - 使用echarts中的圖表 一個頁面導入了好幾個js圖表 實現echarts圖表隨著瀏覽器窗口變化而變化時出現了問題
