mybatis一对多对象关联,但是返回数据为一对一

 

项目中使用mybatis查询结果,有时需要嵌套对象,即返回对象中要有list集合,对象含有子集集合(查询的主表与关联子表数据一对多关系)

java对象:

public class Typegroup extends ResultBaseDataObject {

    @ExcelIgnore
    @ApiModelProperty(value = "主键")
    private Long id;

    @ExcelProperty(value = "分组代码")
    @ApiModelProperty(value = "分组代码")
    private String typegroupCode;

    @ExcelProperty(value = "分组名称")
    @ApiModelProperty(value = "分组名称")
    private String typegroupName;

    @ExcelIgnore
    @ApiModelProperty(value = "父级分组id")
    private String parentId;

    @ExcelIgnore
    @ApiModelProperty(value = "父级分组代码")
    private String parentTypegroupCode;

    @ExcelProperty(value = "父级分组名称")
    @ApiModelProperty(value = "父级分组名称")
    private String parentTypegroupName;

    @ExcelIgnore
    @ApiModelProperty(value = "排序")
    private int sort;

    /**
     * 是否是多级节点,1 :代表多级节点 默认为空或者为0
     */
    @ExcelIgnore
    private String isManyTop;

    @ExcelIgnore
    private String isDown;
    @ExcelIgnore
    private String isMany;
    
    @ExcelIgnore
    private List<TypePojo> typeList;
    

}

mybatis配置文件:使用 <collection>标签配置子对象映射

<resultMap id="typegroupResultMap" type="com.unism.pojo.basicData.Typegroup">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="typegroup_code" jdbcType="VARCHAR" property="typegroupCode" />
    <result column="typegroup_name" jdbcType="VARCHAR" property="typegroupName" />
    <result column="is_many" jdbcType="VARCHAR" property="isMany" />
    <result column="sort" jdbcType="VARCHAR" property="sort" />
    <result column="parent_typegroup_code" jdbcType="VARCHAR" property="parentTypegroupCode" />
    <collection property="typeList" javaType="list" ofType="com.unism.pojo.basicData.TypePojo">
         <result column="typegroup_id" jdbcType="BIGINT" property="typegroupId" />
        <result column="type_code" jdbcType="VARCHAR" property="typeCode" />
        <result column="type_name" jdbcType="VARCHAR" property="typeName" />
    </collection>
  </resultMap>

查询sql:

  <select id="queryTypeListByParentTypegroupCode" parameterType="java.lang.String" resultMap="typegroupResultMap">
        SELECT
        a.id, a.typegroup_code,a.typegroup_name,a.parent_typegroup_code,b.typegroup_id,b.type_code,b.type_name
        FROM
        tbl_service_typegroup a  ,
        tbl_service_type b  
        WHERE
        a.id = b.typegroup_id
        AND a.parent_typegroup_code = #{parentTypegroupCode,jdbcType=VARCHAR}
        ORDER BY
        a.sort,
        b.sort
    </select>

但是有的时候返回解决不是我们想要的格式,比如有三个Typegroup对象,没有Typegroup对象中有四个TypePojo子对象

想要的结果是List<Typegroup>里有三个Typegroup对象,每一个Typegroup对象中有一个List<TypePojo>,list中有四个TypePojo对象,但是返回结果是一个List<Typegroup>里有12个Typegroup对象

产生原因是:没有设置主键id,要在返回结果resultMap中设置主键映射:

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

mybatis要依照相同的主键进行映射返回对象,封装数据

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个Java持久层框架,它可以通过XML或注解将数据库操作映射到Java对象。在MyBatis中进行一对多关联查询有几种方式可以实现。 1. 嵌套查询(Nested Queries):这是一种常见的方式,可以在父查询中调用子查询来获取相关的多个子对象。具体步骤如下: - 在Mapper XML文件中定义两个查询语句,一个用于获取父对象,另一个用于获取子对象列表。 - 在父对象的查询语句中使用"resultMap"属性来指定子对象的映射关系,并在子对象的查询语句中使用"collection"属性来指定父对象的映射关系。 - 在Java代码中调用父对象的查询方法即可。 2. 延迟加载(Lazy Loading):当父查询中包含多个子对象时,可以使用延迟加载的方式来提高查询性能。具体步骤如下: - 在Mapper XML文件中定义两个查询语句,一个用于获取父对象,另一个用于获取子对象列表。 - 在父对象的查询语句中使用"resultMap"属性来指定子对象的映射关系,并在子对象的查询语句中使用"collection"属性来指定父对象的映射关系,并设置"fetchType"为"lazy"。 - 在Java代码中调用父对象的查询方法时,子对象列表将不会立即加载,只有在访问子对象列表时才会触发加载。 3. 嵌套结果映射(Nested Result Maps):在父对象中直接嵌套子对象的方式来进行一对多关联查询。具体步骤如下: - 在Mapper XML文件中定义一个查询语句,同时在"resultMap"中定义父对象的属性和子对象的映射关系。 - 在Java代码中调用查询方法即可,MyBatis会自动将结果映射到父对象的对应属性中,而子对象则会作为父对象属性的集合。 以上是一些常见的在MyBatis中进行一对多关联查询的方法,具体选择哪种方式取决于具体的业务需求和性能要求。希望对你有帮助!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值