SQL查询一对多,返回形式为集合套集合

SQL查询一对多,返回形式为集合套集合

  • 实体
  • .xml
    • 重点语句解释
      • 1、collection
        • 参数解释
      • 2、case... when... then... else...end...
        • 参数说明
      • *** 注意:

实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class NoticeInfo extends BaseEntity {
    private String userName;
    private String nickName;

    @TableField(exist = false)
    private String fileType;

    @TableField(exist = false)
    private List<PubFileInfo> pubFile;

}

.xml


	<resultMap type="NoticeInfo" id="NoticeInfoMap">
		
		<result property="userName" column="user_name" jdbcType="VARCHAR"/>
		<result property="nickName" column="nick_name" jdbcType="VARCHAR"/>
		<!--		重点语句-->
		<collection property="pubFile" select="selectPub" column="noticeId = notice_id,type = fileType" ofType="NoticeInfo"/>
	</resultMap>
	<sql id="Base_Column_List">
		user_name, nick_name
	</sql>
	<select id="selectListAll" parameterType="NoticeInfo" resultMap="NoticeInfoMap">
		select
		<include refid="Base_Column_List" />,
		<!--		重点语句-->
		    case when('${fileType}' is null) then null else '${fileType}' end as fileType
		from notice_info
		
	</select>
	<select id="selectPub" resultMap="PubFileInfoMapper.BaseResultMap">
		select
			file_id, file_type, natural_id, storage_name, show_name, absolute_url
			
		from pub_file_info
		where natural_id=#{noticeId} and file_type=#{type,jdbcType=VARCHAR}
	</select>

重点语句解释

1、collection

<collection property="pubFile" select="selectPub" column="noticeId = notice_id,type = fileType" ofType="NoticeInfo"/>

Mybatis在处理关联表时非常好用的一种语法是Collection,使得查询起来更加方便。Collection的应用非常广泛,比如一个表mainTable与表subTable存在一对多的关系,Mybatis可以用Collection语法以比较简单的方式得到查询结果。
使用Collection的步骤如下:
1、编写SQL,把主表的实体与子表的实体混合在一起,使用连接子句,然后返回主表的所有字段,以及子表想要得到的字段
2、编写与主表一一对应的Mapper
3、在mainTableMapper中声明一个collection,该collection指向子表的mapper
4、在mybatis的配置文件中配置上述collection
5、在主表中通过主键字段作为循环结构,通过collection来存放子表查询结果
联接表查询是Mybatis最常用的技术之一。Collection语法可以让我们在SQL语句中更加灵活地处理数据,而且查询效率非常高。
Mybatis的collection语法能够让我们用一句SQL实现更多的功能,比如从一张表中得到多条数据记录,或者从两张表联接查询重组以供使用。当我们不得不查询比较复杂的表时,Mybatis的collection是非常受用的,它可以减少我们的编码工作量,并且让查询更加规范。

参数解释
参数名 解释
property 实体中的变量名
select 查询语句
column 查询语句中传递的参数
ofType 返回结果注入的实体

2、case… when… then… else…end…

 case when('${fileType}' is null) then null else '${fileType}' end as fileType

SQL中的CASE语句通常与WHEN、THEN和ELSE一起使用,用于在SELECT语句中条件性地返回值或执行操作。WHEN用于指定条件,THEN用于指定要返回或执行的操作,ELSE用于指定当所有条件都不匹配时返回或执行的操作

参数说明
参数 说明
(‘${fileType}’ is null) 条件表达式
then后 null 当条件表达式为TRUE时返回的结果
else后 ‘${fileType}’ 当条件表达式为false时返回的结果
fileType 返回的结果集的列别名

*** 注意:

本文中使用case… when… then… else…end…的原因是因为fileType 为非表字段,mybatis中无法将 ‘查询参数中的有且在查询结果中没有的值’直接在Collection中传递使用,故而我们使用case… when… then… else…end…虚拟一个参数,再进行传递使用

你可能感兴趣的:(sql,mybatis,java)