mybatis綁定多個mapper,@ResultMap 報錯: Mapped Statements collection already contains value for .......
一般有三個原因:
- parameterMap改成parameterType...
- id 重復(fù)
- parameterType參數(shù)有問題
檢查了 id,沒有重復(fù)的,檢查了parameterMap等常規(guī)錯誤,沒發(fā)現(xiàn)問題。
事件還原:
大概是這樣的,項(xiàng)目中用了 mybatis的自動生成代碼插件龙巨,
于是生成了類似 Activity.java使鹅、ActivityMapper.java篇亭、ActivityMapper.xml 的這三種文件绝淡。
為了方便替換生成的文件宙刘,自動生成的ActivityMapper.xml就盡量不改動,我們自己寫的sql就放在命名為 ActivityExtMapper.xml中, 當(dāng)然xml里面的namespace要和ActivitiMapper.xml保持一致牢酵。
于是悬包,一個ActivityMapper.java就對應(yīng)了兩個 xml文件。xxx.xml.auto.generate 目錄放的自動生成的xml, xxx.xml就是自己寫的xml,如圖:
于是馍乙,在配置文件中布近,掃描xml的路徑為:
突然,問題出現(xiàn)了!
因?yàn)轫?xiàng)目是多人寫的,所以我們的sql有用注解的吊输,有用xml的。比如铁追,其中有個sql就用的注解季蚂,如圖:
我覺得這個問題奇葩的地方是,這個sql最近沒改過琅束,而且之前一直運(yùn)行好好的扭屁,突然昨天在我的電腦和另外個同事的電腦上運(yùn)行的時候,就會報錯:Mapped Statements collection already contains value for xxx.getProductInvestOrders; 但是在其他同事的電腦中運(yùn)行又沒問題涩禀!
后來才發(fā)現(xiàn)料滥,是因?yàn)橛卸鄠€mapper.xml, 執(zhí)行sql時是隨機(jī)找了一個xml來綁定ResultMap,可能會綁定到自動生成的xxMapper.xml中的BaseResultMap艾船。
而這個sql的ResultMap的ID是自己寫的定義在 xxxExtMapper.xml中的,所以執(zhí)行sql的時候葵腹,就會報錯,意思是已經(jīng)為這個sql綁定了一個ResultMap了屿岂,不要重復(fù)綁定践宴。
問題找到了,就是要指定加載xml的順序爷怀。如圖:
總結(jié)下來阻肩,還是對mybatis的掌握不夠深入。注解用得也比較少运授。
轉(zhuǎn)自 blueriver 博客
原文鏈接