1. 程式人生 > >mybatis一對多關聯查詢子表只返回一條資料

mybatis一對多關聯查詢子表只返回一條資料

注意:在mybatis的部分版本中發現當兩個表的主鍵列名一致,比如都是id時,配置關聯查詢時子表只能返回1條資料,在這裡提供一種簡單的方法,避免大量修改檔案,由於我的原始碼不便公開,請大家看這裡的原始碼:

http://blog.csdn.net/qinshijangshan/article/details/60955096###;

  1. -- 使用者表
  2. CREATETABLE `user1`(  
  3.     `id` INTPRIMARYKEY AUTO_INCREMENT,  
  4.     `user_name` VARCHAR(20),-- 使用者姓名
  5.     `address` VARCHAR(60)-- 聯絡地址
  6. ) ENGINE INNODB CHARSET utf8;  
  7. INSERTINTO `user1` VALUES(1,'陳大','深圳市南山區');  
  8. INSERTINTO `user1` VALUES(2,'王二','深圳市福田區');  
  9. INSERTINTO `user1` VALUES(3,'張三','深圳市龍華新區');  
  10. INSERTINTO `user1` VALUES(4,'李四','深圳市龍崗區');  
  11. -- 卡表
  12. CREATETABLE `card1`(  
  13.     `id` INTPRIMARYKEY AUTO_INCREMENT,  
  14.     `card_no` VARCHAR(18),  
  15.     `remark` VARCHAR(100),  
  16.     `user_id` INT-- 用於關聯user1的主鍵id(不設定外來鍵,避免級聯問題)
  17. ) ENGINE=INNODB CHARSET=utf8;  
  18. INSERTINTO `card1` VALUES(1,'420001','工資卡',1);  
  19. INSERTINTO `card1` VALUES(2,'420002','工資卡',2);  
  20. INSERTINTO `card1` VALUES(3,'420003','工資卡',3);  
  21. INSERTINTO `card1` VALUES(4,'420004','工資卡',3);  
  22. -- SELECT * FROM `user1`;
  23. -- SELECT * FROM `card1`;

實體類:Card1

  1. package com.chensan.o2m.entity;  
  2. publicclass Card1 {  
  3.     privateint id;  
  4.     private String cardNo;  
  5.     private String remark;  
  6.     //...省略setter、getter方法
  7. }  
實體類:User1
  1. package com.chensan.o2m.entity;  
  2. import java.util.List;  
  3. publicclass User1 {  
  4.     privateint id;  
  5.     private String userName;  
  6.     private String address;  
  7.     private List<Card1> cards;  
  8.     public String toString(){  
  9.         return"[ id = " + id  + ", userName = "
  10.             + userName + ", address = " + address + "]";  
  11.     }  
  12.     //...省略setter、getter方法
  13. }  

實體類User1對映檔案

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mappernamespace="com.chensan.o2m.entity.User1Mapper">
  5.   <resultMapid="user1"type="com.chensan.o2m.entity.User1">
  6.     <idproperty="id"column="user_id"/>
  7.     <resultproperty="userName"column="user_name"/>
  8.     <resultproperty="address"column="address"/>
  9.     <collectionproperty="cards"column="user_id"ofType="com.chensan.o2m.entity.Card1">
  10.         <idproperty="id"column="id"/>
  11.         <resultproperty="cardNo"column="card_no"/>
  12.         <resultproperty="remark"column="remark"/>
  13.     </collection>
  14.   </resultMap>
  15.    <!--方法1不查詢子表id,此方法是原文作者的方法-->
  16.   <selectid="query"parameterType="int"resultMap="user1">
  17.     SELECT t1.`id` `user_id`,t1.`user_name`,t1.`address`,t2.`id`,t2.`card_no`,t2.`remark`   
  18.     FROM `user1` t1,`card1` t2   
  19.     WHERE t1.`id`=t2.`user_id` AND t1.`id`=#{id}  
  20.   </select>
  21. </mapper>

上面的方法不能返回子表的主鍵,當我們必須要返回主鍵時,可以使用別名規避兩個表主鍵一直的衝突,主要修改如下



時間有限,比較糙,如果錯誤,歡迎指正