myBatis实现三级嵌套复杂对象的赋值问题

平常我们工作中基本最多两级嵌套,但是有时候难免会遇到三级嵌套的业务场景,笔者最近就碰到了,使用一般的嵌套发现赋值为空,这可难倒了菜逼的我,后来在stackoverflow的帮助下终于搜到了解决办法,完美解决了问题 ,总结一下,方便有需要的同学,下面直接上栗子:

首先上实体类:三级嵌套如下 (电站 -----> 电桩 ---->电枪)

电站实体类 (实体为JPA写法,不影响mybatis的使用)

package com.weima.cecapp.entities;

import lombok.Data;

import lombok.NoArgsConstructor;

import org.hibernate.annotations.BatchSize;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

import java.util.Collections;

import java.util.List;

import java.util.Set;

@NoArgsConstructor

@Data

@Entity

@Table(name = "station_info")

public class StationInfo {

/**

* Auto-generated primary key.

*/

@Id

@GeneratedValue(generator = "uuid")

@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")

@Column(unique = true, nullable = false, updatable = false)

private String id;

@Column(name = "station_id")

private String stationId;

@Column(name = "operator_id")

private String operatorId;

@Column(name = "equipment_owner_id")

private String equipmentOwnerId;

@Column

private String stationName;

@Column

private String countryCode;

@Column

private String areaCode;

@Column

private String address;

@Column

private String stationTel;

@Column

private String serviceTel;

@Column

private Integer stationType;

@Column

private Integer stationStatus;

@Column

private Integer parkNums;

@Column

private Double stationLng;

@Column

private Double stationLat;

@Column

private String siteGuide;

@Column

private Integer construction;

@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, orphanRemoval = true, mappedBy = "ownerStationInfo")

private List<StationPicture> pictures;

@Column

private String matchCars;

@Column

private String parkInfo;

@Column

private String busineHours;

@Column(name = "busine_hours_in_milliseconds")

private Long busineHoursInMilliseconds;

@Column

private String electricityFee;

@Column

private String serviceFee;

@Column

private String parkFee;

@Column

private String payment;

@Column

private Integer supportOrder;

@Column

private String remark;

@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, orphanRemoval = true, mappedBy = "ownerStationInfo")

@BatchSize(size = 20)

private List<EquipmentInfo> equipmentInfos;

}

电站图片实体

package com.weima.cecapp.entities;

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.ToString;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Data

@Entity

@EqualsAndHashCode(of = {"url"})

@ToString(exclude = {"ownerStationInfo"})

@Table(name = "station_picture")

public class StationPicture {

/**

* Auto-generated primary key.

*/

@Id

@GeneratedValue(generator = "uuid")

@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")

@Column(unique = true, nullable = false, insertable = true, updatable = false)

private String id;

@ManyToOne(fetch = FetchType.EAGER, optional = false)

@JoinColumn(nullable = false, updatable = false)

private StationInfo ownerStationInfo;

@Column

private String url;

}

电桩实体类

package com.weima.cecapp.entities;

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.ToString;

import org.hibernate.annotations.BatchSize;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Collections;

import java.util.List;

@Data

@Entity

@EqualsAndHashCode(of = {"equipmentId"})

@ToString(exclude = {"ownerStationInfo"})

@Table(name = "equipment_info")

public class EquipmentInfo {

/**

* Auto-generated primary key.

*/

@Id

@GeneratedValue(generator = "uuid")

@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")

@Column(unique = true, nullable = false, updatable = false)

private String id;

@Column(name = "equipment_id")

private String equipmentId;

@ManyToOne(fetch = FetchType.EAGER, optional = false)

@JoinColumn(nullable = false, updatable = false)

private StationInfo ownerStationInfo;

@Column(name = "manufacturer_id")

private String manufacturerId;

@Column

private String manufacturerName;

@Column

private String equipmentModel;

@Column

private String productionDate;

public String getProductionDate() {

String format = null;

if (this.productionDate != null) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

try {

format = sdf.format(sdf.parse(this.productionDate));

} catch (ParseException e) {

e.printStackTrace();

}

return format;

}

return format;

}

@Column

private String equipmentType;

@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "ownerEquipmentInfo", cascade = {CascadeType.PERSIST})

@BatchSize(size = 20)

private List<ConnectorInfo> connectorInfos;

@Column

private Double equipmentLng;

@Column

private Double equipmentLat;

@Column

private Double power;

@Column

private String equipmentName;

@Column(name = "equipment_no")

//cpo's custom equipmentId mostly for Evstation

private String equipmentNo;

}

电枪实体类

package com.weima.cecapp.entities;

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.ToString;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Data

@Entity

@EqualsAndHashCode(of = {"connectorId"})

@ToString(exclude = {"ownerEquipmentInfo"})

@Table(name = "connector_info")

public class ConnectorInfo {

/**

* Auto-generated primary key.

*/

@Id

@GeneratedValue(generator = "uuid")

@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")

@Column(unique = true, nullable = false, updatable = false)

private String id;

@ManyToOne(fetch = FetchType.EAGER, optional = false)

@JoinColumn(nullable = false, updatable = false)

private EquipmentInfo ownerEquipmentInfo;

@Column(name = "connector_id")

private String connectorId;

@Column

private String connectorName;

@Column

private Integer connectorType;

@Column

private Integer voltageUpperLimits;

@Column

private Integer voltageLowerLimits;

@Column

private Integer current;

@Column

private Double power;

@Column

private String parkNo;

@Column

private Integer nationalStandard;

@Column(name = "connector_no")

//cpo's custom connectorId mostly for Evstation

private String connectorNo;

}

mapper 文件的resultMap映射及Sql语句的书写,要特别注意映射关系

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.hubject.cecapp.mapper.StationInfoAnyueMapper">

<resultMap id="templateListResp" type="com.hubject.cecapp.entities.EquipmentInfo">

<!-- 充电桩信息-->

<id column ="id " property="id"/>

<result column="equipment_id " property="equipmentId"/>

<result column="equipment_lat " property="manufacturerName"/>

<result column="equipment_lng " property="equipmentModel"/>

<result column="equipment_model " property="productionDate"/>

<result column="equipment_name " property="manufacturerId"/>

<result column="equipment_type " property="equipmentType"/>

<result column="manufacturer_id " property="equipmentLng"/>

<result column="manufacturer_name " property="equipmentLat"/>

<result column="power " property="power"/>

<result column="production_date " property="equipmentName"/>

<result column="owner_station_info_id " property="equipmentNo"/>

<!-- 充电枪 信息列表 -->

<collection property="connectorInfos" columnPrefix="f_" ofType="com.hubject.cecapp.entities.ConnectorInfo">

<id column="id" property="id"/>

<result column="connector_id" property="connectorId"/>

<result column="connector_name" property="connectorName"/>

<result column="connector_type" property="connectorType"/>

<result column="voltage_upper_limits" property="voltageUpperLimits"/>

<result column="voltage_lower_limits" property="voltageLowerLimits"/>

<result column="current" property="current"/>

<result column="power" property="power"/>

<result column="park_no" property="parkNo"/>

<result column="national_standard" property="nationalStandard"/>

<result column="connector_no" property="connectorNo"/>

</collection>

</resultMap>

<!-- 通用查询映射结果 -->

<resultMap id="Base3ResultMap" type="com.hubject.cecapp.entities.StationInfo">

<result column="id" property="id"/>

<result column="address" property="address"/>

<result column="area_code" property="areaCode"/>

<result column="busine_hours" property="busineHours"/>

<result column="construction" property="construction"/>

<result column="country_code" property="countryCode"/>

<result column="electricity_fee" property="electricityFee"/>

<result column="equipment_owner_id" property="equipmentOwnerId"/>

<result column="station_id" property="stationId"/>

<result column="operator_id" property="operatorId"/>

<result column="station_name" property="stationName"/>

<result column="station_tel" property="stationTel"/>

<result column="service_tel" property="serviceTel"/>

<result column="station_type" property="stationType"/>

<result column="station_status" property="stationStatus"/>

<result column="park_nums" property="parkNums"/>

<result column="station_lng" property="stationLng"/>

<result column="station_lat" property="stationLat"/>

<result column="site_guide" property="siteGuide"/>

<result column="match_cars" property="matchCars"/>

<result column="park_info" property="parkInfo"/>

<result column="busine_hoursIn_milliseconds" property="busineHoursInMilliseconds"/>

<result column="service_fee" property="serviceFee"/>

<result column="park_fee" property="parkFee"/>

<result column="payment" property="payment"/>

<result column="support_order" property="supportOrder"/>

<result column="remark" property="remark"/>

<result column="templateListResp" property="remark"/>

<collection property="equipmentInfos" columnPrefix="t_" resultMap="templateListResp"/>

</resultMap>

-- 要特别注意的是 t_f_ 的前缀,这个关乎到映射不映射上的根本。

<select id="queryAreaForAnyoCharging" resultMap="Base3ResultMap">

select

a.id as id,

a.station_id as station_id,

a.operator_id as operator_id,

a.equipment_owner_id as equipment_owner_id,

a.station_name as station_name,

a.country_code as country_code,

a.area_code as area_code,

a.address as address,

a.station_tel as station_tel,

a.service_tel as service_tel,

a.station_type as station_type,

a.station_status as station_status,

a.park_nums as park_nums,

a.station_lng as station_lng,

a.station_lat as station_lat,

a.site_guide as site_guide,

a. construction as construction,

a.match_cars as match_cars,

a.park_info as park_info,

a.busine_hours as busine_hours,

a.busine_hours_in_milliseconds as busine_hours_in_milliseconds,

a. electricity_fee as electricity_fee,

a. service_fee as service_fee,

a. park_fee as park_fee,

a. payment as payment,

a. support_order as support_order,

a.remark as remark

,

e.id as t_id ,

e.equipment_id as t_equipment_id ,

e.equipment_lat as t_equipment_lat ,

e.equipment_lng as t_equipment_lng ,

e.equipment_model as t_equipment_model ,

e.equipment_name as t_equipment_name ,

e.equipment_type as t_equipment_type ,

e.manufacturer_id as t_manufacturer_id ,

e.manufacturer_name as t_manufacturer_name ,

e.power as t_power ,

e.production_date as t_production_date ,

e.owner_station_info_id as t_owner_station_info_id ,

e.equipment_no as t_equipment_no

,

c.id as t_f_id ,

c.power as t_f_power ,

c.current as t_f_current ,

c.park_no as t_f_park_no ,

c.connector_id as t_f_connector_id ,

c.connector_name as t_f_connector_name ,

c.connector_type as t_f_connector_type ,

c.connector_no as t_f_connector_no ,

c.national_standard as t_f_national_standard ,

c.voltage_lower_limits as t_f_voltage_lower_limits ,

c.voltage_upper_limits as t_f_voltage_upper_limits ,

c.owner_equipment_info_id as t_f_owner_equipment_info_id

from station_info a join equipment_info e on a.id = e.owner_station_info_id

join connector_info c on e.id = c.owner_equipment_info_id

where a.operator_id='MA59J8YL8'

</select>

</mapper>

希望为遇到同样需求的同学提供到帮助。

到此这篇关于myBatis实现三级嵌套复杂对象的赋值问题的文章就介绍到这了,更多相关myBatis三级嵌套复杂对象的赋值内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

以上是 myBatis实现三级嵌套复杂对象的赋值问题 的全部内容, 来源链接: utcz.com/z/323048.html

回到顶部