myBatis实现三 级嵌套复杂对象的赋值问题
作者:李定魁 发布时间:2023-11-23 06:42:26
标签: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>
希望为遇到同样需求的同学提供到帮助。
来源:https://blog.csdn.net/weixin_40916825/article/details/109638901


猜你喜欢
- Android强制异步转同步方法,供大家参考,具体内容如下Android系统中规定耗时任务需要在异步线程中进行,特别是网络请求必须在异步线程
- 调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先
- 设置项这个版本已经取消了defalut settings指定成默认配置的选项,所以配置都是在settings中配置设置项设置统一UTF-8编
- 目录一:背景二:从 dump 文件中提取源代码1. 案例演示2. 使用 lm + savemodule 命令提取3. 使用 dumpdoma
- 介绍今天主要分享一下 kafka 的 rebalance,在 kafka 中,rebalance 是一个十分重要的概念,很多时候引发的一些问
- 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-edit
- 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
- 因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为 根据提供的模板来导出Excel报表并且可根据提供的模板S
- 如何查看 Java 的字节码文件?在 Java 中,字节码文件.class实际上是二进制文件,并不能直接查看。要想查看,我们只能通过反编译对
- 本文实例讲述了Java操作redis实现增删查改功能的方法。分享给大家供大家参考,具体如下:首先,我们需要在windows下配置一个redi
- 本文实例为大家分享了java实现酒店管理系统的具体代码,供大家参考,具体内容如下编写环境:MyEclipse2014+sql server2
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- 关于迭代器你都知道什么?什么是迭代器?  所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,
- 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供
- 本文实例讲述了Android编程之分辨率处理相关代码段。分享给大家供大家参考,具体如下:1. 通常我们所说的屏幕分辨率如800x480、96
- 前言小伙伴们知道,在 Shiro 中,默认是支持权限通配符的,例如系统用户有如下一些权限:system:user:addsystem:use
- 背景:本人不是Java开发人员,经过四年多的历练,可以说是一枚BI攻城师了吧,最近粗糙的写了一个Portal来集成cognos报表,下面就入
- 要求: * 判断用户输入的年份是平年还是闰年实现代码:import java.util.Scanner;/** * 要
- 前言前面文章我们介绍了Broker是如何将消息全量存储到CommitLog文件中,并异步生成dispatchRequest任务更新Consu
- 看一段程序String t = "a||b||c||d";String[] temp = t.split("\