作者:herogan | 来源:互联网 | 2023-10-11 19:30
在用mybatis写mysql语句时,遇到了1对多关系的问题
先看看关系:
以A表为基础查询,A表一条记录对应B表的一条记录,而A表的一条记录对应C表的n条记录,然后B表和c表是1对1的关系。这时候的查询语句为:
<mapper namespace&#61;"mapper.AMapper"><resultMap id&#61;"AMap" type&#61;"dto.A"><id column&#61;"A_ID" property&#61;"AId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" /><result column&#61;"B_ID" property&#61;"BId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" /><association property&#61;"B" javaType&#61;"dto.B"><id column&#61;"t_B_id" property&#61;"BId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" />association><collection property&#61;"C" javaType&#61;"java.util.List" ofType&#61;"dto.C"><id column&#61;"C_C_ID" property&#61;"CId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" /><result column&#61;"C_A_ID" property&#61;"AId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" /><association property&#61;"C_B" javaType&#61;"dto.B"><id column&#61;"u_B_id" property&#61;"BId" jdbcType&#61;"DECIMAL" javaType&#61;"Long" />association>collection>resultMap><select id&#61;"selectA_WithC_ById" parameterType&#61;"java.lang.Long" resultMap&#61;"AMap">SELECT *FROMA LEFT JOINBONA.A_ID &#61; B.B_idLEFT JOINCONC.C_ID &#61; A.A_IDLEFT JOINB c_bONC.C_ID &#61; c_b.B_idWHEREA.A_ID &#61; #{id}select>
mapper>
查询原理&#xff1a;
注意&#xff1a;因为表会重复&#xff0c;所以相同的表&#xff0c;要起别名。同样的&#xff0c;相同的列名也要起别名&#xff0c;不然会出错的。还有一个问题&#xff0c;这个语句直接拿去mysql里面运行&#xff0c;和在项目里面运行&#xff0c;得到的结果条数可能不一样&#xff0c;因为在项目里面&#xff0c;已经把重复的数据和为一条&#xff0c;把不同的存入list中了。
这个有点复杂&#xff0c;但是慢慢的写就可以写好了&#xff0c;还好我写的时候没有报错。