1. 背景介紹
項(xiàng)目框架使用的是spring boot+mybatisplus等構(gòu)建,現(xiàn)在接口需求是通過標(biāo)簽(label)匹配相應(yīng)
的作品,這里production里存的是label的多個(gè)id集合,Mysql數(shù)據(jù)格式為json格式,存儲格式如下:

production表中l(wèi)abel字段
現(xiàn)在接口需求是通過前端傳過來的id數(shù)據(jù)進(jìn)行對label的多對多匹配。
2. 難點(diǎn)
由于是多對多匹配,所以在xml中先進(jìn)行數(shù)組轉(zhuǎn)list后對list的遍歷,然后通過MYSQL JSON函數(shù)(主要用到這兩個(gè)方法:JSON_CONTAINS(tags, '["xxx"]');和JSON_EXTRACT())
JSON_CONTAINS(tags, '["xxx"]'); 查找目標(biāo)中是否包含xxx
JSON_EXTRACT(目標(biāo)json字段,"\$.name");是JSON提取函數(shù),$.name 指json數(shù)據(jù)中的key值(通過key提取目標(biāo)json中的value)

xml中針對標(biāo)簽字段多對多查詢語句
3.疑點(diǎn)
一開始是遇到這個(gè)問題:用短字符串可以匹配到數(shù)據(jù),字符串太長就沒數(shù)據(jù)。

兩次查詢結(jié)果不同,total應(yīng)該都為1的
接下來找到問題所在是因?yàn)閿?shù)據(jù)拼接的問題:

這是xml里定義的轉(zhuǎn)換后的sql語句

去掉拼接,直接加參數(shù),這樣是有數(shù)據(jù)的
解決辦法:
這里出現(xiàn)該問題的原因應(yīng)該就是這個(gè)sql拼接的問題,由于傳進(jìn)來的是遍歷過后的單值,所以這里參數(shù)就不需要加“[]”了,直接用json_contains()方法以單個(gè)字符串的形式進(jìn)行匹配。

json_contains()不傳數(shù)組類型參數(shù)
這樣就避免了json_contains()參數(shù)傳“拼接的數(shù)組”出現(xiàn)查不到數(shù)據(jù)的問題了,至于這個(gè)拼接個(gè)人后期還有待研究哪里出問題了。