mybatis中resultMap嵌套list的寫法(兩種)


方式一:
代碼復用性高, 主表分頁查詢正確(主表分頁查詢時,子表會將所有的數據查詢出來)

QuestionMapper.xml

<mapper namespace="com.xxx.modules.xxx.mapper.QuestionMapper">

<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="sort" property="sort" jdbcType="INTEGER" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.xxx.entity.QuestionOption"
select="com.xxx.modules.xxx.mapper.QuestionOptionMapper.selectList" column="{qid=id,sort=sort}" />
<!-- qid/sort是定義的變量名, id/sort是主表的字段id/sort,
先查出主表的結果, 然后主表記錄數是幾 就執行幾次 collection 的select,
javaType和ofType 寫不寫都行,
select的值: 對應xml的namespace + 對應xml中的代碼片段的id,
column作為select語句的參數傳入,如果只傳一個參數id可以簡寫: column="id" -->
</resultMap>

 

<!-- 查詢列表 -->
<select id="selectList" resultMap="BaseResultMap">
SELECT
pq.id, pq.content, pq.type, pq.sort
FROM
question AS pq
<where>
</where>
</select>
QuestionOptionMapper.xml

<mapper namespace="com.xxx.modules.xxx.mapper.QuestionOptionMapper">

<!-- 查詢列表 -->
<select id="selectList" resultType="QuestionOption">
SELECT
pqo.id, pqo.content, pqo.sort
FROM
question_option AS pqo
<where>
pqo.qid = #{qid} <!-- 變量名 qid 對應上文的 qid -->
<!-- 如果上文中 collection只傳一個參數column="id",只要類型匹配,在這里隨便寫個變量名就可以取到值 #{xyz} -->
</where>
</select>

方式二:

只需要執行一次sql查詢, 主表分頁查詢不正確(會查詢出所有的笛卡爾積,根據分頁直接截取,可能會導致子表數據缺失的問題)

QuestionMapper.xml

<mapper namespace="com.xxx.modules.xxx.mapper.QuestionMapper">

<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="sort" property="sort" jdbcType="INTEGER" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.data.entity.QuestionOption">
<id column="oid" property="id" jdbcType="VARCHAR" />
<result column="ocontent" property="content" jdbcType="VARCHAR" />
<result column="osort" property="sort" jdbcType="INTEGER" />
</collection>
<!-- 列的別名 oid,ocontent,osort , 起別名是因為主子表都有這幾個字段
這里要寫 ofType, javaType還是可以不寫 -->
</resultMap>

<!-- 查詢列表 -->
<select id="selectList" resultMap="BaseResultMap">
SELECT
pq.id, pq.content, pq.type, pq.sort
,pqo.id AS oid ,pqo.content AS ocontent ,pqo.sort AS osort <!-- 聯查子表字段,起別名 -->
FROM
question AS pq
LEFT JOIN question_option pqo ON pq.id = pqo.qid <!-- 聯查子表 -->
<where>
</where>
</select>


注意: 主子表要查詢出來的字段名重復,要起別名

 

地址:https://blog.csdn.net/lzxomg/article/details/89739651


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM