今天用MyBatis查询一对多关系,发现当查询结果出现两个相同字段名,查询结果会出错。

例子:

当我用下面这个sql语句查询时

SELECT
orders.*,
user.username,
user.address,
orderdetail.id,
orderdetail.item_id,
orderdetail.item_num,
orderdetail.item_price
FROM
orders
INNER JOIN
orderdetail
INNER JOIN
`user`
ON
orders.id=orderdetail.orders_id AND orders.user_id=user.id 

出来的查询结果如下:

上方有两个相同字段id。

mapper文件resultMap配置:

   <resultMap type="po.Orders" id="orderUserDetailResult"extends="orderCustomerResult"><collection property="orderdetails" ofType="po.Orderdetail"><id property="id" column="id" /><result property="item_id" column="item_id" /><result property="item_num" column="item_num" /><result property="item_price" column="item_price" /></collection>

其他配置忽略。

javaBean对象代码:

orders.java

package po;import java.util.List;/*** 订单信息* @author Thinkpad**/
public class Orders {private int id;//订单idprivate int user_id;//用户idprivate String order_number;//订单号private User user;//用户信息private List<Orderdetail> orderdetails;//订单明细信息public int getId() {return id;}public void setId(int id) {this.id = id;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}public String getOrder_number() {return order_number;}public void setOrder_number(String order_number) {this.order_number = order_number;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public List<Orderdetail> getOrderdetails() {return orderdetails;}public void setOrderdetails(List<Orderdetail> orderdetails) {this.orderdetails = orderdetails;}}

测试代码:

    @Testpublic void testFindOrdersUserDetails(){SqlSessionFactory factory=MyBatisUtils.factory;SqlSession session=null;try {session=factory.openSession();OrderMapper orderMapper=session.getMapper(OrderMapper.class);List<Orders>list=orderMapper.findOrderUserDetailList();System.out.println(list.size());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(session!=null){session.close();}}}

其他对象代码没有上传。

然后查看调试结果:

log4j日志输出表明查询结果有四条记录,符合sql查询结果。

然后我们查看,映射结果。

mybatis自动映射生成两个Order对象,但第一个orderdetails集合只有一个对象,第二个orderdetails集合也只有一个对象。但是根据sql查询结果,两个order对象下orderdetails集合数量和应该为4.

修改sql语句:

SELECT
orders.*,
user.username,
user.address,
##使用别名
orderdetail.id orderdetail_id,
orderdetail.item_id,
orderdetail.item_num,
orderdetail.item_price
FROM
orders
INNER JOIN
orderdetail
INNER JOIN
`user`
ON
orders.id=orderdetail.orders_id AND orders.user_id=user.id 

sql查询结果:

与上面sql查询结果类似,只是有一个id字段名改变

修改mapper的resultMap配置文件

    <resultMap type="po.Orders" id="orderUserDetailResult"extends="orderCustomerResult"><collection property="orderdetails" ofType="po.Orderdetail"><!-- column与指定别名名字相同 --><id property="id" column="orderdetail_id" /><result property="item_id" column="item_id" /><result property="item_num" column="item_num" /><result property="item_price" column="item_price" /></collection></resultMap>

其他不变

调试结果:

总共四条记录,与sql查询记录相同。

然后查看映射结果

这样查询结果两个order下的orderdetail集合存在总共四个对象。

总结:

MyBatis多表查询,需要注意相同字段问题,突然一想上次Hibernate多表查询出现相同字段,也是出现错误。

MyBatis sql查询字段问题相关推荐

  1. sql查询字段的值不为空

    sql查询字段的值不为空 SQRJS IS NOT NULL AND SQRJS <![CDATA[ <> ]]> ''

  2. SQL 查询字段包含特殊符号的数据

    SQL 查询字段包含特殊符号的数据 SQL 查询字段中包含单引号 查询的时候输入两个单引号就转义了 ,chr(39) 表示单引号.chr(40)表示双引号 eg: select * from XX.T ...

  3. sql查询字段重复的数据 并且修改数据某个字段

    1.sql查询字段重复的数据 并且修改所有行某个字段值 UPDATE 表名 a SET a.要修改的字段名 = 1 WHEREa.重复字段 IN (SELECTb.重复字段FROM(SELECTc.重 ...

  4. mybatis动态查询字段、动态更新字段

    一.动态查询字段并返回list 接收的对象 @Data public class TableFieldOutput implements Serializable {private static fi ...

  5. mybatis关联查询字段重复问题

    参考地址:https://blog.csdn.net/khuangz/article/details/78207722 1.多表查询时,当列id重名时,mybatis会默认使用查询出的第一个id列(另 ...

  6. sql查询字段结果显示部分_SQL语句结构分析

    SQL语句结构: -- 第二步执行语句 select 查询结果 -- 第一步执行语句,数据来源和查询条件 from 表名 where 查询条件 group by 分组字段 having 分组指定条件 ...

  7. asp sql查询字段 过滤空格_SQL面试经典问答集萃

    1.何为SQL? SQL(结构化查询语言)是一种设计用于对数据库进行检索.操作数据的语言.它是由美国国家标准协会(ANSI)制定的标准,可用于对数据库,执行选择,更新,删除和插入等数据操作等相关任务. ...

  8. Oracle中SQL查询字段值为空时,指定默认值

    一.实现效果 实现设备字段有值显示[加工]否则显示[未加工] 二.Oracle中NVL 2.1.NVL函数功能介绍 NVL 是Oracle的函数,功能是实现空值的转换,如果fieldName为NULL ...

  9. java解析sql查询字段_sql解析json格式字段 如何获取json中某个字段的值?

    java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...

  10. mybatis Sql查询 返回对象或者list数据中包含一个对象的list集合

    1. 查询的数据对象 @Data public class JdOrder implements Serializable{     private Long orderId; private Lon ...

最新文章

  1. 博客园外挂之一Web搜索引擎命中统计
  2. python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE)、MAPE指标解读、MAPE指标使用的注意事项
  3. R语言中如何计算C-Statistics?几种计算方法详解
  4. 零基础学Python:一文看懂数字和字符串
  5. linux下如何让程序无法重复启动
  6. python正确的输入语句_手把手教你在python中如何使用while True语句
  7. Ajax同步调用 异步排序
  8. sql截取字符串并把字符串插入到表中的存储过程
  9. 使用ocr的自动备份还原ocr
  10. 网站加速和服务器加速区别,cdn加速与不加速区别
  11. MySQL MVCC 概述
  12. Kali Linux Web 渗透测试秘籍 第九章 客户端攻击和社会工程
  13. c# datagridview列形式为Combobox,每行下拉选项不一样
  14. 区块链 数据读权限 设计方案
  15. UWP—网易云音乐的APP分析
  16. Cocos2dx 3.2移植到Android 完全可行的方法
  17. 艾艾贴redis集群
  18. 智点木门软件为百闰门业解决哪些问题?
  19. Event Bubbling Exampl
  20. 解锁“绿色计算产业白皮书”,海量数据携手绿盟成员共促生态繁荣

热门文章

  1. Php调用工行支付接口时的问题解决
  2. sql server 2000:不能打开到主机的连接,在端口1433:连接失败
  3. 猪年的第一天没有压岁钱
  4. 拓端tecdat|SAS中用单因素ANOVA研究不同疗法对焦虑症的有效性
  5. java socket wex5,在wex5中如何一行代码更新数据
  6. 计算机网络-扩展路由器网段
  7. linux 位置参数数组,荐Linux中的shell编程Ⅱ——位置参数、数组、date和cal
  8. 初中数学知识点总结_初中数学函数知识点总结
  9. OpenCV 基本模块
  10. linux性能分析top iostat vmstat free,Linux性能分析工具(vmstat,iostat,sar)