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

作者:李定魁 时间:2023-11-23 06:42:26 

平常我们工作中基本最多两级嵌套,但是有时候难免会遇到 * 嵌套的业务场景,笔者最近就碰到了,使用一般的嵌套发现赋值为空,这可难倒了菜逼的我,后来在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>

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

来源:https://blog.csdn.net/weixin_40916825/article/details/109638901

标签:myBatis,三,级嵌套,复杂对象,赋值
0
投稿

猜你喜欢

  • 测试stringbuilder运行效率示例

    2023-06-02 04:01:34
  • DevExpress SplitContainerControl用法总结

    2022-06-13 22:10:24
  • Mybatis中的Criteria条件查询方式

    2022-02-21 06:49:46
  • c#哈希算法的实现方法及思路

    2023-10-22 01:48:08
  • Android仿IOS UIAlertView对话框

    2023-09-28 09:00:12
  • Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    2022-04-19 04:36:01
  • C# Winform调用百度接口实现人脸识别教程(附源码)

    2021-12-27 13:17:09
  • java实现马踏棋盘算法(骑士周游问题)

    2022-03-17 20:29:46
  • Android编程实现WebView自适应全屏方法小结

    2022-09-20 09:33:09
  • android 触屏的震动响应接口调用方法

    2021-08-04 08:33:34
  • C# 泛型字典 Dictionary的使用详解

    2022-01-19 23:48:17
  • Java中Cookie和Session详解及区别总结

    2022-08-24 21:55:10
  • Android开发Jetpack组件LiveData使用讲解

    2023-03-21 09:27:49
  • Android开发之ToggleButton实现开关效果示例

    2022-01-12 20:22:30
  • unity实现弧形移动 可角度自定

    2022-12-16 22:38:19
  • C#求n个数中最大值和最小值的方法

    2022-04-20 08:00:01
  • ReentrantLock从源码解析Java多线程同步学习

    2023-10-13 02:32:55
  • C# XmlDocument操作XML案例详解

    2021-11-23 04:00:01
  • Java Servlet简单实例分享(文件上传下载demo)

    2022-03-03 06:35:04
  • Spring的组合注解和元注解原理与用法详解

    2023-12-05 10:25:05
  • asp之家 软件编程 m.aspxhome.com