mybatis查询一对多返回List<String>集合

4 篇文章 0 订阅
2 篇文章 0 订阅

先看两张表

channel_auth 授权信息主表 —— channel_auth_method 授权方法表

channel_auth表授权信息主表channel_auth_method表授权方法表
id主表idauth_id主表id
app_key授权公钥method方法
app_user授权账号

entity:

@Data
@TableName("channel_auth")
public class ChannelAuthDO {
    @TableId
    private Long id;
    private String appKey;//授权公钥
    private String appUser; //授权账号
    
    @TableField(exist = false)
    private List<String> method; //方法集合
}

查询ChannelAuthDO时,要关联channel_auth_method表,查询method,把实体中的List<String> method填充,进去

方式一:使用collection标签 中的 select

<resultMap type="ChannelAuthDO" id="BaseMap">
     <id property="id" column="id"/>
     <result property="appKey" column="app_key"/>
     <result property="appUser" column="app_user"/>

     <!-- 关联属性对应的表:ChannelAuthMethodDO的method字段 -->
     <collection property="method" ofType="String" select="select_method" column="id"/>
</resultMap>

<select id="list" resultType="ChannelAuthDO" resultMap="BaseMap">
	select id, app_key, app_user
    from channel_auth
</select>

<!--查询方法表 
		这个是映射collection 中select_method的方法  
		这里的authId对应collection 中的column="id"
-->
 <select id="select_method" resultType="string" parameterType="long">
      select method
      from channel_auth_method
      where auth_id = #{authId}
  </select>

弊端:当主表信息全部查出来以后,collection 会一个一个遍历去调用select_method方法,数据多的话会影响性能。

方式二:构造函数注入

<resultMap type="ChannelAuthDO" id="BaseMap">
	   <id property="id" column="id"/>
	   <result property="appKey" column="app_key"/>
	   <result property="appUser" column="app_user"/>
	
	   <!-- 关联属性对应的表:ChannelAuthMethodDO的method字段 -->
	   <collection property="method" ofType="java.lang.String">
	       <constructor>
	           <arg column="table_method"/>  <!-- 对号入座数据库column名称即可 -->
	       </constructor>
	   </collection>
</resultMap>

<!-- 直接用id关联,查出来的method会自动映射在List<String> method 中 -->
<select id="list" resultType="ChannelAuthDO" resultMap="BaseMap">
    select 
	     main.id,
	     main.app_key,
	     main.app_user,
	     method."method" as table_method   为区分上面的映射关系,这边重新命名
    from channel_auth main, channel_auth_method method
    where main.id = method.auth_id
</select>

弊端:会影响分页

拓展:

如果list既有List<String>又有 List<Integer>,则需要写两个collection的构造函数注入

<resultMap type="ChannelAuthDO" id="BaseMap">
	   <id property="id" column="id"/>
	   <result property="appKey" column="app_key"/>
	   <result property="appUser" column="app_user"/>
	   
	   <!-- 映射字符串集合 -->
	   <collection property="method" ofType="java.lang.String">
	       <constructor>
	           <arg column="table_method"/>  <!-- 数据库映射的column名称 -->
	       </constructor>
	   </collection>
	   
	   <!-- 映射int类型集合 -->
	   <collection property="age" ofType="java.lang.Integer">
	       <constructor>
	           <arg column="age"/>  <!-- 数据库映射的column名称 -->
	       </constructor>
	   </collection>
</resultMap>

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值