Mybatis无主键的关联数据去重问题如何解决

寻技术 JAVA编程 / 其他编程 2023年08月06日 90

本文小编为大家详细介绍“Mybatis无主键的关联数据去重问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“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>
    关闭

    用微信“扫一扫”