問題
我在mapper中寫<collection/>
作聯合查詢的時候,返回的結果裏沒有聯合查詢的數據。使用debug在控制檯把sql語句打印出來後,發現根本沒有執行聯合查詢對應的sql語句。
代碼
先試result的代碼
<resultMap type="com.mytest.domain.ActivityRecord" id="baseactivityRecordResultMap">
<id column="RECORD_ID" property="recordId" />
<result column="CREATE_TIME" property="createTime" />
<result column="RECORD_CONTENT" property="recordContent" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="USER_ID" property="userId" />
<result column="ACTIVITY_ID" property="activityId" />
<result column="RECORD_ADDRESS" property="recordAddress" />
<result column="JOIN_TIME" property="joinTime" />
</resultMap>
<resultMap type="com.mytest.domain.ActivityRecord" id="activityRecordResultMap" extends="baseactivityRecordResultMap">
<collection column="RECORD_ID" property="files" ofType="com.mytest.domain.SysFile" javaType="java.util.ArrayList" select="com.mytest.dao.SysFileDao.getAttachment"/>
</resultMap>
然後是未修改前的主sql語句
<select id="getActivityRecordContent" resultMap="activityRecordResultMap">
SELECT CREATE_TIME,RECORD_CONTENT,RECORD_ADDRESS,JOIN_TIME,USER_ID,ACTIVITY_ID
FROM ACTIVITY_RECORD
WHERE RECORD_ID=#{recordId}
</select>
因爲之前說了,程序根本沒有走collection
的查詢方法,因此和這collection
參數的關係並不太大,除了column
大概原理
<collection/>
中的column
表示你要拿現在查詢出來的哪一條或者哪幾條數據當做聯合查詢的條件。
可以看到我寫的<collection/>
中的column
是RECORD_ID
,但是我的主sql語句的select
結果集裏並不包含RECORD_ID
,mybatis找不到RECORD_ID
這個字段,因此就會直接忽略掉以RECORD_ID
爲查詢條件的 <collection/>
這個組合查詢
解決方法
將RECORD_ID
加入到SELECT
查詢結果集裏即可
<select id="getActivityRecordContent" resultMap="activityRecordResultMap">
SELECT CREATE_TIME,RECORD_CONTENT,RECORD_ADDRESS,JOIN_TIME,USER_ID,ACTIVITY_ID,RECORD_ID
FROM ACTIVITY_RECORD
WHERE RECORD_ID=#{recordId}
</select>