今天在做一个一对多的关联查询时,明明对面有多条数据,但是死活只能拿到第一条,xml文件的配置如下
其中,cn.college.school.vo.MenuSupportVo 对象里面有这样一个属性
//关联的学校列表
private List<School> schools;
关联都是正常的mybatis操作,如果mybatis不熟的请自行百度
cn.college.school.dao.SchoolDao.menuGetSchool 对应的查询为
<select id="menuGetSchool" resultType="cn.college.school.vo.MenuSupportVo" >
select * from school where id in (${_parameter});
</select>
之所以用 ${} 来包围是因为我传过去的 schoolIds 参数是 这样的 21,23,24 如果用#{} 包围mybatis会把其当为占位符来传递
只会查到一条记录了
${_parameter} 不用 ${schoolIds} 是因为 如果只有一个参数过来时,有时会报一个错
There is no getter for property named 'XXX' in 'class java.lang.String'
这是mybatis本身的问题,要么在接口加上 @Param 来映射,要么就用这个,我的因为是在xml文件引用的,所以就用了这个参数
然后查询的时候是这样的
mybatis打印的日志是3条记录,但是返回的对象始终只能映射第一条,后来参考了几篇文章,说是因为两张表的字段有些重复了,导致只能映射一个
https://blog.csdn.net/yangjiehuan/article/details/78523080
但是上面都是连接查询的,而我的是用collection的select进行查询关联的,所以很麻烦,知道原因后
其实我只是想查询 name 属性过来而已,那能不能直接用String来接收,然后试了一下
跟原来的其实差不多,只是查询语句变了
首先在 cn.college.school.vo.MenuSupportVo 加了这样一个属性
//学校名称
private List<String> schoolNames;
然后把 第一xml文件的内容改为
红色指示的是修改的地方
然后再把那边的文件改为
<select id="menuGetSchool" resultType="java.lang.String" >
select name from school where id in (${_parameter});
</select>
然后再次查询,发现就可以了,如下图
很明显是可以的,所以就使用了这样的方法来处理即可
参考文章
https://www.cnblogs.com/orac/p/6726323.html
https://www.cnblogs.com/orac/p/6726323.html
https://blog.csdn.net/yangjiehuan/article/details/78523080
记录一下,防止下次出现同样的问题没有头绪