今天花了一下午时间发现了mybatis的一个用法,就是查询嵌套传参的时候会把集合中的参数给“”用掉”,所谓用掉,就是作为参数传递给嵌套查询的参数不会在返回结果集中显示。解决办法就是做两个参数命不同的名字,一个用作查询嵌套的传递,另外一个用作结果集的返回。
上例子:
<select id="getCoreTerminalInfoByBranchSysNo_2" resultMap="bmTerminalWithCharges_2" parameterType="java.util.Map">
SELECT
BT.TERMINAL_SYS_NO as mtSysNo,
MCA.TERMINAL_NO AS terminalNo,
MCA.TERMINAL_NO AS terminalNo1,
BT.PRINT_SHOP_NAME AS printShopName,
BT.PROGRAM AS program,
BT.SERV_MODEL AS servModel,
MCA.EFFECT_DATE AS effectDate,
MCA.INSTALL_DATE AS installDate,
MCA.UNINSTALL_DATE AS uninstallDate,
BT.TERMINAL_NUM AS terminalNum,
BT.FIXED_POS_NUM AS fixedPosNum,
BT.MOVE_POS_NUM AS movePosNum,
BT.MPOS_NUM AS mposNum,
BT.DEV_TYPE_REMARK as devTypeRemark,
BT.RATE_MODE_FLG as rateModeFlg,
MCA.TRANSACTION_TYPE as transactionType,
BT.TRANSACTION_TYPE AS transactionType1
FROM M_CARD_APP MCA
LEFT JOIN BM_TERMINAL BT ON BT.TERMINAL_SYS_NO = MCA.TERMINAL_SYS_NO
LEFT JOIN BM_BRANCH BB ON BB.BRANCH_SYS_NO = BT.BRANCH_SYS_NO
WHERE BB.BRANCH_SYS_NO = #{branchSysNo}
</select>
<resultMap id="bmTerminalWithCharges_2" type="java.util.HashMap">
<collection property="chargeDetails" column="{mtSysNo=mtSysNo}" select="searchBmChargeDetailListByMtSysNo_Map"/>
<collection property="mAccount" column="{terminalSysNo=mtSysNo,terminalNo=terminalNo1}" select="selectMAccountByTermimalSysmNoAndTerminalNo"/>
<collection property="mRateInfos" column="{terminalSysNo=mtSysNo,terminalNo=terminalNo1}" select="selectMRateInfosByTermimalSysmNoAndTerminalNo"/>
</resultMap>
传递参数用了terminalNo1,而返回结果用terminalNo.
为了发现这个问题前后做了二三十条数据,排除了集合问题,参数个数问题,返回类型问题等情况,最后把问题限定到了只跟terminalNo这个字段。因为没有仔细对比缺失字段跟原集合的关系,所以我没有最终发现问题,还是让小组长帮我搞定。这也说明了有的看似很诡异的问题其实是可以自己发现自己解决的,前提是解决方法要正确,并且要细心,一个不小心就会让你在最后关头和成功失之交臂。当然,这只是个小问题,没那么严重,哈哈。