Mybatis多表链接查询重复字段问题
A表和B表一对多的关系
A表
B表
A表和C表也是一对多关系
C表
我现在向查询出A表的所有字段和B表的name字段,C表的name字段
这是我错误的sql语句,可以看出我没有查B表和C表的id字段,这也是我后来查出重复字段的原因
select a.*,b.name,c.name from A a left join B b on a.name=b.name left join C c on a.name=c.name
我的Mybatis配置文件是通过resultMap接收返回的对象
<resultMap id="BpmNodeTemplate" type="com.major.workflow.persistence.model.BpmNodeTemplate"> <id property="id" column="id" jdbcType="VARCHAR"/> <result property="type" column="type" jdbcType="VARCHAR"/> <result property="title" column="title" jdbcType="VARCHAR"/> <result property="description" column="description" jdbcType="VARCHAR"/> <result property="icon" column="icon" jdbcType="VARCHAR"/> <collection property="groupses" ofType="com.major.workflow.persistence.model.BpmNodeGroups"> <id column="g_id" property="id"></id> <result column="g_name" property="name"></result> <result column="node" property="node"></result> </collection> <collection property="packages" ofType="com.major.workflow.persistence.model.BpmNodePropertyPackages"> <id column="p_id" property="id"></id> <result column="p_name" property="name"></result> <result column="node" property="node"></result> </collection> </resultMap>
可以看出我定义了两个Collection来接受查询出来的list对象,也就是B表和C表的name,实体类定义的是list<A>,list<B>,对应的配置文件用collection接收从数据库查询出来的数据。
错误原因:因为我没有查出B,C两表的id所以在resultMap接收数据的时候会将多个相同的name放入collection,最终封装到list里面
这是我查询出来的结果,最终封装的时候lUsertask这个对象的list<A>里面会出现6个数据(其实我只需要两个数据即可活动列表和q),list<B>也是一样
解决办法:把id查出来就行了,resultMap是根据id区分不同的元素,如果你id不同他就会认为你是不同的元素,这个错误在很多人看来很简单就解决了我却头疼了好长时间,网上没有找到解决办法,所以写这篇文章希望给和我一样的朋友一点帮助