Mybatis关联查询遇到的坑-无主键的关联数据去重问题
作者:p7+
这篇文章主要介绍了Mybatis关联查询遇到的坑-无主键的关联数据去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
先说下结论
使用Mybatis的association关联查询时,例如 DeviceInfo 关联 RawData 查询数据,如果查询的SQL不包含DeviceInfo的主键时
Mybatis会将查询的结果集按照RawData数据进行去重,与你有没有使用group by无关。
解决方法1
如果你的查询不需要关联数据,重写resultMap,去掉association关联的部分,此时无论你有没有查询主键,返回的数据都是正确数据
<resultMap id="DeviceTypeResultMap" type="DeviceInfo"> <!-- 有没有查询主键,返回的数据都是正确数据 --> <!--<id column="device_id" property="deviceId" jdbcType="BIGINT"></id>--> <result column="device_type_name" property="deviceTypeName" jdbcType="VARCHAR" /> <result column="device_type_id" property="deviceTypeId" jdbcType="INTEGER" /> </resultMap>
解决方法2
如果你的查询不需要关联数据,但是懒的再写resultMap,那么SQL的查询字段一定要加上主表的主键
例子:
DeviceInfo
public class DeviceInfo implements Serializable { private Long deviceId; private Integer deviceTypeId; private String deviceTypeName; private RawData rawData; …… }
DeviceInfo 关联查询 RawData 返回的 resultMap
<resultMap id="BaseResultMap" type="DeviceInfo"> <id column="device_id" property="deviceId" jdbcType="BIGINT"></id> <result column="mac" property="mac" jdbcType="VARCHAR" /> <result column="device_type_id" property="deviceTypeId" jdbcType="BIGINT" /> <association property="rawData" javaType="RawData"> <id column="device_id" property="deviceId" /> <result column="data_time" property="dataTime" jdbcType="TIMESTAMP" /> <result column="battery_power" property="batteryPower" jdbcType="TINYINT" /> </association> </resultMap>
根据 device_type_id 分组查询 device_type_id 和 device_type_name
<select id="getDeviceTypeList" parameterType="DeviceInfo" resultMap="BaseResultMap"> select device_type_id,device_type_name FROM tb_device_info group by device_type_id order by null </select>
最后
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。