MyBatis 查询结果的某个字段为List

本文介绍了如何在MyBatis中处理查询结果的一个字段为List的情况,包括Entity实体的定义,预先编写查询语句,设置resultMap以传递查询条件,并在Mapper.java中进行操作。同时提到了一种效率较高但可能影响维护性的写法。

Entity实体

@Data
public class TextUrbanVO {

	@TableId
	@ApiModelProperty(value = "")
	private Long id;

	@ApiModelProperty(value = "市编号")
	private Long cityId;

	@ApiModelProperty(value = "城市名称")
	private String urbanName;

	@ApiModelProperty(value = "学校列表")
	private List<TextSchool> schools;

	@ApiModelProperty(value = "医院列表")
	private List<TextHospital> hospitals;
}
@Data
public class TextHospital {

	@ApiModelProperty(value = "")
	private Long id;

	@ApiModelProperty(value = "市id")
	private Long urbanId;

	@ApiModelProperty(value = "医院名称")
	private String hospitalName;

	@ApiModelProperty(value = "人数")
	private Integer people;
}
@Data
public class TextSchool {

	@ApiModelProperty(value = "")
	private Long id;

	@ApiModelProperty(value = "市id")
	private Long urbanId;

	@ApiModelProperty(value = "学校名称")
	private String schoolName;

	@ApiModelProperty(value = "人数")
	private Integer people;
}

事先定义需要根据条件查询的语句


	<!--根据市id查询医院列表-->
	<select id="hospitalByUrbanId" resultType="io.kelvins.bsip.device.api.entity.TextHospital">
		select * from text_hospital where urban_id = #{urbanId}
	</select>
	
	<!--根据市id查询学校列表-->
	<select id="schoolByUrbanId" resultType="io.kelvins.bsip.device.api.entity.TextSchool">
		select * from text_school where urban_id = #{urbanId}
	</select>
	
属性名描述必填
propertyEntity对应的字段
javaTypeEntity对应字段类型
ofTypeEntity对应字段泛型
select查询数据的方法,要写下全路径
column作为select语句的参数传入,要写下全路径

resultMap里传入查询条件


	<resultMap id="TextUrbanMap" type="io.kelvins.bsip.device.api.entity.TextUrbanVO">
		<id property="id" column="id"/>
		<result property="cityId" column="city_id"/>
		<result property="urbanName" column="urban_name"/>
		<collection property="schools" 
					javaType="list" 
					ofType="io.kelvins.bsip.device.api.entity.TextSchool"
					select="io.kelvins.bsip.device.mapper.TextUrbanMapper.schoolByUrbanId" 
					column="{urbanId = id}"/>
		<collection property="hospitals" 
					javaType="list" 
					ofType="io.kelvins.bsip.device.api.entity.TextHospital"
					select="io.kelvins.bsip.device.mapper.TextUrbanMapper.hospitalByUrbanId" 
					column="{urbanId = id}"/>
					<!--或者	column="id"-->
	</resultMap>
	
	<!--查询市列表-->
	<select id="textUrbanList" resultMap="TextUrbanMap">
		select * from text_urban
	</select>
	

Mapper.java

/**
 * (TextUrban)数据库访问层
 *
 * @author kelvins
 * @date 2022-12-26 11:34:18
 */
public interface TextUrbanMapper extends BaseMapper<TextUrban> {

	/**
	 * 市列表
	 *
	 * @return
	 */
	List<TextUrbanVO> textUrbanList();

	/**
	 * 根据市id查询医院列表
	 *
	 * @param urbanId
	 * @return
	 */
	List<TextHospital> hospitalByUrbanId(@Param("urbanId") Long urbanId);

	/**
	 * 根据市id查询学校列表
	 *
	 * @param urbanId
	 * @return
	 */
	List<TextSchool> schoolByUrbanId(@Param("urbanId") Long urbanId);
}

第二种写法,效率高,但不利于维护


	<!--注意字段名称重复要起别名对应例如各个表中的id-->
	<resultMap id="TextUrbanMap" type="io.kelvins.bsip.device.api.entity.TextUrbanVO">
		<id property="id" column="id"/>
		<result property="cityId" column="city_id"/>
		<result property="urbanName" column="urban_name"/>
		<!--collection标签中不在需要select、column属性-->
		<collection property="schools" javaType="list" ofType="io.kelvins.bsip.device.api.entity.TextSchool" >
			<id property="id" column="s_id"/>
			<result property="urbanId" column="s_urban_id"/>
			<result property="schoolName" column="s_school_name"/>
			<result property="people" column="s_people"/>
		</collection>
		<collection property="hospitals" javaType="list" ofType="io.kelvins.bsip.device.api.entity.TextHospital">
			<id property="id" column="h_id"/>
			<result property="urbanId" column="h_urban_id"/>
			<result property="hospitalName" column="h_hospital_name"/>
			<result property="people" column="h_people"/>
		</collection>
	</resultMap>


	<!--查询市列表-->
	<select id="textUrbanList" resultMap="TextUrbanMap">
		SELECT
			urban.id,
			urban.city_id,
			urban.urban_name,
			school.id s_id,
			school.urban_id s_urban_id,
			school.school_name s_school_name,
			school.people s_people,
			hospital.id h_id,
			hospital.urban_id h_urban_id,
			hospital.hospital_name h_hospital_name,
			hospital.people h_people
		FROM
			text_urban urban
			LEFT JOIN text_school school ON urban.id = school.urban_id
			LEFT JOIN text_hospital hospital ON urban.id = hospital.urban_id
	</select>

Java 中使用 MyBatis 进行指定查询字段为特定类型的操作可以通过以下几种常见方式实现: ### 方式一:使用 `QueryWrapper` 指定查询字段MyBatis-Plus 中,可以使用 `QueryWrapper` 来指定查询字段,同时结合实体类来保证类型的准确性。以下是一个示例代码: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.test.entity.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class StudentService { @Autowired private StudentMapper studentMapper; public List<Student> selectSpecifiedFields() { QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); // 指定查询字段 queryWrapper.select("id", "name"); List<Student> students = studentMapper.selectList(queryWrapper); return students; } } ``` 这里的 `Student` 实体类可参考引用[1]中的定义,通过 `select` 方法指定了要查询字段查询结果会根据实体类的属性类型进行映射。 ### 方式二:使用 `ResultMap` 映射指定字段到特定类型 在 MyBatis 的 XML 映射文件中,可以使用 `ResultMap` 来指定查询字段和实体类属性的映射关系,确保查询字段映射到特定类型。示例如下: ```xml <mapper namespace="com.test.mapper.StudentMapper"> <resultMap id="StudentResultMap" type="com.test.entity.Student"> <id property="id" column="id"/> <result property="name" column="name"/> </resultMap> <select id="selectSpecifiedFields" resultMap="StudentResultMap"> SELECT id, name FROM student </select> </mapper> ``` 对应的 Mapper 接口如下: ```java import com.test.entity.Student; import java.util.List; public interface StudentMapper { List<Student> selectSpecifiedFields(); } ``` 这样在查询时,会将查询结果按照 `ResultMap` 中定义的映射关系映射到 `Student` 实体类的属性上,保证了字段的类型。 ### 方式三:使用 `@Results` 和 `@Result` 注解 在 Mapper 接口中,可以使用 `@Results` 和 `@Result` 注解来实现类似 `ResultMap` 的功能。示例如下: ```java import com.test.entity.Student; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; public interface StudentMapper { @Select("SELECT id, name FROM student") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name") }) List<Student> selectSpecifiedFields(); } ``` 这种方式同样可以将查询结果映射到 `Student` 实体类的属性上,确保字段的类型正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值