mybatis一對多關聯查詢子表只返回一條資料
阿新 • • 發佈:2019-02-02
注意:在mybatis的部分版本中發現當兩個表的主鍵列名一致,比如都是id時,配置關聯查詢時子表只能返回1條資料,在這裡提供一種簡單的方法,避免大量修改檔案,由於我的原始碼不便公開,請大家看這裡的原始碼:
http://blog.csdn.net/qinshijangshan/article/details/60955096###;
- -- 使用者表
- CREATETABLE `user1`(
- `id` INTPRIMARYKEY AUTO_INCREMENT,
- `user_name` VARCHAR(20),-- 使用者姓名
- `address` VARCHAR(60)-- 聯絡地址
- ) ENGINE INNODB CHARSET utf8;
- INSERTINTO `user1` VALUES(1,'陳大','深圳市南山區');
- INSERTINTO `user1` VALUES(2,'王二','深圳市福田區');
- INSERTINTO `user1` VALUES(3,'張三','深圳市龍華新區');
- INSERTINTO `user1` VALUES(4,'李四','深圳市龍崗區');
- -- 卡表
- CREATETABLE `card1`(
- `id` INTPRIMARYKEY AUTO_INCREMENT,
- `card_no` VARCHAR(18),
- `remark` VARCHAR(100),
- `user_id` INT-- 用於關聯user1的主鍵id(不設定外來鍵,避免級聯問題)
- ) ENGINE=INNODB CHARSET=utf8;
- INSERTINTO `card1` VALUES(1,'420001','工資卡',1);
- INSERTINTO `card1` VALUES(2,'420002','工資卡',2);
- INSERTINTO `card1` VALUES(3,'420003','工資卡',3);
- INSERTINTO `card1` VALUES(4,'420004','工資卡',3);
- -- SELECT * FROM `user1`;
- -- SELECT * FROM `card1`;
實體類:Card1
- package com.chensan.o2m.entity;
- publicclass Card1 {
- privateint id;
- private String cardNo;
- private String remark;
- //...省略setter、getter方法
- }
- package com.chensan.o2m.entity;
- import java.util.List;
- publicclass User1 {
- privateint id;
- private String userName;
- private String address;
- private List<Card1> cards;
- public String toString(){
- return"[ id = " + id + ", userName = "
- + userName + ", address = " + address + "]";
- }
- //...省略setter、getter方法
- }
實體類User1對映檔案
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mappernamespace="com.chensan.o2m.entity.User1Mapper">
- <resultMapid="user1"type="com.chensan.o2m.entity.User1">
- <idproperty="id"column="user_id"/>
- <resultproperty="userName"column="user_name"/>
- <resultproperty="address"column="address"/>
- <collectionproperty="cards"column="user_id"ofType="com.chensan.o2m.entity.Card1">
- <idproperty="id"column="id"/>
- <resultproperty="cardNo"column="card_no"/>
- <resultproperty="remark"column="remark"/>
- </collection>
- </resultMap>
- <!--方法1不查詢子表id,此方法是原文作者的方法-->
- <selectid="query"parameterType="int"resultMap="user1">
- SELECT t1.`id` `user_id`,t1.`user_name`,t1.`address`,t2.`id`,t2.`card_no`,t2.`remark`
- FROM `user1` t1,`card1` t2
- WHERE t1.`id`=t2.`user_id` AND t1.`id`=#{id}
- </select>
- </mapper>
上面的方法不能返回子表的主鍵,當我們必須要返回主鍵時,可以使用別名規避兩個表主鍵一直的衝突,主要修改如下
時間有限,比較糙,如果錯誤,歡迎指正