问题
我在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>