您好,登錄后才能下訂單哦!
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>
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。