我们要对数据库中的两张表进行管理查询,但是不幸的是这两张表有相同的字段名,导致最后查询出来的结果里这两个字段的值是相同的!很显然某一个被另一个给覆盖了,而原因就是:多表关联查询时有相同的字段名,解决方案其实很简单,定义结果集和查询的时候都取一个别名就可以了!
实体类1:User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
private String address;
//一对多映射集合
private List<Account> accounts;
}
实体类2:Account.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
private Integer id;
private Integer uid;
private Double money;
}
UserMapper 接口:
public interface UserMapper {
List<User> findAllUser();
}
mapper.xml文件:下面写法是错误的,这样查出来的id只有一个
<mapper namespace="com.tedu.dao.UserMapper">
<resultMap id="userAccountMap" type="user">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<collection property="accounts" javaType="ArrayList" ofType="Account">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
</collection>
</resultMap>
<select id="findAllUser" resultMap="userAccountMap">
select u.id, u.name, u.age, u.address,
a.id, a.uid, a.money
from user u
left join account a
on u.id = a.uid;
</select>
正确方法:要解决这个问题很简单,拿上面的例子来说,我们要给结果集userAccountMap的字段起个别名,然后在下面的select语句中查询时再给字段起个相同的别名:
<mapper namespace="com.tedu.dao.UserMapper">
<resultMap id="userAccountMap" type="user">
<id column="id1" property="id"/> <!--此处给父表的id起了别名id1-->
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<collection property="accounts" javaType="ArrayList" ofType="Account">
<id column="id" property="id"/> <!--此处给子表的id起了别名id2-->
<result column="uid" property="uid"/>
<result column="money" property="money"/>
</collection>
</resultMap>
<select id="findAllUser" resultMap="userAccountMap">
select u.id id1, /*与结果集对应的别名id1*/
u.name, u.age, u.address,
a.id id2, /*与结果集对应的别名id2*/
a.uid, a.money
from user u
left join account a
on u.id = a.uid;
</select>
这么做就可以解决问题了。