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

网友投稿 658 2023-03-14

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

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 pictures;

@Column

private String matchCars;

@Column

private String parkInfo;

@Column

private String buyNdDgsineHours;

@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 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 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语句的书写,要特别注意映射关系

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

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_productionyNdDg_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'

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小程序抓包插件有哪些功能(小程序https抓包)
下一篇:超级APP(超级电销app)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~