今天用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;//订单id private int user_id;//用户id private 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; } }
测试代码:
@Test public 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 block e.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使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...
MyBatis拦截器实现通用权限字段添加的方法 MyBatis拦截器是一种非常实用的技术,可以用来实现各种复杂的数据库操作。本文将详细介绍如何使用MyBatis拦截器来实现通用权限字段添加,达到灵活、可靠、可维护的数据库...
在SQL查询中,当需要查找含有特定字段或字符串的数据时,`LIKE`关键字通常是首选工具。`LIKE`关键字配合通配符 `%` 可以帮助我们进行模糊匹配。例如,如果我们有一个`ConnectName`表,其中`name`字段存储着联系人的...
在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...
在Struts2+MyBatis的环境下,我们需要解决两个主要问题:如何将二进制数据存入数据库以及如何从数据库读取并在前端展示或下载。 1. 存储`LONGBLOB`字段: 在MyBatis中,自定义TypeHandler是非常重要的,它负责将...
在使用MyBatis-SQL生成器时,需要注意文件编码格式的问题。文件编码格式必须与系统和编辑器保持一致,通常推荐使用UTF-8,因为这是大部分现代软件默认的编码格式,如果更改了编码,可能导致乱码或者程序无法正常运行...
总之,MyBatis提供了灵活的动态SQL机制,允许我们根据数据库字段的状态构造查询条件。通过巧妙地使用`OR`和`AND`,以及必要的括号,可以满足多种复杂的查询需求。不过,当条件变得非常复杂时,也可以考虑使用`...
这个插件的主要作用是自动识别Mybatis中的Update语句,根据传入的参数对象,只对设置了新值的字段生成UPDATE语句,从而避免了全字段更新的问题,提高了数据更新的效率,并降低了数据库锁定的风险。在原1.0版本中,...
然后,创建一个实体类,例如`User.java`,并使用Mybatis的注解定义字段和SQL操作: ```java public class User { private Long id; private String name; private String email; // getters and setters @...
MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不...
例如,当查询条件中包含某个字段时,我们可以使用`<if>`来决定是否添加该字段的WHERE子句。这样可以避免因为空值而导致的无效SQL。 ```xml != null"> AND name = #{name} ``` 2. `<choose>`, `<when>`, `...
MyBatis是一款优秀的持久层框架,它支持自定义SQL查询语句,并能与Java对象自动进行映射,极大简化了基于JDBC的数据库操作。然而,由于需要手动编写SQL语句,如果不加以防范,则可能会面临SQL注入的风险。 #### ...
MyBatis、Spring和SQL Server、MySQL这四个关键词组合在一起,揭示了一个关于如何在Java后端开发中,利用这些技术实现高效分页查询的实践场景。这里我们将深入探讨这些技术及其在分页实现中的应用。 MyBatis是一个...
在上面的代码中,我们定义了一个 UserMapper 接口,该接口中有一个 selectUser 方法,该方法使用@Select 注解来定义一个 SQL 语句,该 SQL 语句用于从 table01 表中根据 id 字段查询用户信息。 通过 XML 配置文件...
Mapper XML文件包含了SQL语句的具体实现,与DAO接口对应,MyBatis框架会根据这些XML文件动态生成SQL执行。 在使用MBG之前,你需要准备以下几样东西: 1. 数据库连接信息:包括数据库URL、用户名和密码,这是MBG连接...
需要注意的是,Elasticsearch查询DSL的灵活性远超SQL,因此在映射过程中可能会遇到更复杂的结构,如聚合(Aggregations)、脚本字段(Script Fields)等。为了支持这些高级功能,自定义插件需要有足够强大的解析和...
XML文件中的SQL语句也会带上从数据库获取的中文字段注释。 6. **运行逆向工程**:使用MyBatis提供的`java org.mybatis.generator.api.MyBatisGenerator`命令,或者将逆向工程集成到构建工具(如Maven或Gradle)中,...
通过修改BoundSql的sql字符串,我们可以实现动态SQL,比如根据条件决定是否包含某个字段的LIKE操作。例如,如果某个参数为null,我们可以将对应的WHERE子句去掉,以避免无效的查询。 以下是一个简单的例子,展示...
通过`<select>`, `<insert>`, `<update>`和`<delete>`标签编写SQL,使用`<resultMap>`进行结果集映射,实现字段与Java对象属性的对应。 3. **MyBatis的注解映射**: 除了XML方式,MyBatis还支持注解方式进行映射。...