Mapper.xml中查詢返回帶有List屬性的實(shí)體類結(jié)果問(wèn)題
剛?cè)肼毠?,參與到一個(gè)項(xiàng)目中,由于是剛畢業(yè)的菜鳥(niǎo),只能分配寫一些查詢的接口代碼。
其中有一個(gè)就是需要返回一個(gè)實(shí)體類的信息,該實(shí)體類帶有List屬性,返回的結(jié)果類似于下圖。

我的解決辦法是將查詢分成兩步,第一步是查詢到對(duì)應(yīng)的表的實(shí)體類結(jié)果,第二部查詢到一個(gè)List集合然后將這個(gè)集合通過(guò)set方法復(fù)制給實(shí)體類。
后來(lái)看了同事的代碼豁然開(kāi)朗,這里用學(xué)生的信息模擬一下。
1.建立學(xué)生關(guān)系表
建了五張表,分別是school(學(xué)院)class(班級(jí))student(班級(jí))course(課程)stu_course(學(xué)生選課表),表結(jié)構(gòu)如下
學(xué)院表

班級(jí)表

學(xué)生表

課程表

學(xué)生選課表

班級(jí)表通過(guò)school_id與學(xué)院表關(guān)聯(lián),學(xué)生表通過(guò)class_id與班級(jí)表關(guān)聯(lián),學(xué)生選課表關(guān)聯(lián)學(xué)生表和課程表。
2.建立springboot項(xiàng)目
在STS中新建springboot項(xiàng)目,application.properties配置如下

pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cheng</groupId>
<artifactId>testspringboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>testspringboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency> -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<!-- <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency> -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
<!--MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<!-- lombok需要的jar包 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>項(xiàng)目建好后使用mybatis plus自動(dòng)生成實(shí)體類service和controller以及Mapper,生成好的如下圖。

并創(chuàng)建要返回的學(xué)生詳細(xì)信息的實(shí)體類StudentDto,該實(shí)體類包含List類型的學(xué)生選課的課程信息
package com.example.chapter3.dto;
import java.io.Serializable;
import java.util.List;
import com.baomidou.mybatisplus.activerecord.Model;
import com.example.chapter3.model.Course;
public class StudentDto extends Model<StudentDto>{
private static final long serialVersionUID = 1L;
/**
* 學(xué)生ID
*/
private String studentId;
/**
* 學(xué)生姓名
*/
private String studentName;
/**
* 學(xué)生年齡
*/
private Integer studentAge;
/**
* 學(xué)生性別
*/
private String studentSex;
/**
* 學(xué)校ID
*/
private String schoolId;
/**
* 班級(jí)ID
*/
private String classId;
private String shcoolName;
private String className;
private List<Course> courses;
@Override
protected Serializable pkVal() {
// TODO Auto-generated method stub
return studentId;
}
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getStudentAge() {
return studentAge;
}
public void setStudentAge(Integer studentAge) {
this.studentAge = studentAge;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
public String getSchoolId() {
return schoolId;
}
public void setSchoolId(String schoolId) {
this.schoolId = schoolId;
}
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
public String getShcoolName() {
return shcoolName;
}
public void setShcoolName(String shcoolName) {
this.shcoolName = shcoolName;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "StudentDto [studentId=" + studentId + ", studentName=" + studentName + ", studentAge=" + studentAge
+ ", studentSex=" + studentSex + ", schoolId=" + schoolId + ", classId=" + classId + ", shcoolName="
+ shcoolName + ", className=" + className + ", courses=" + courses + "]";
}
}3.編寫要查詢的studentMapper.xml(也是自動(dòng)生成的,需要寫部分內(nèi)容)
<?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.example.chapter3.mapper.StudentMapper">
<!-- 通用查詢映射結(jié)果 -->
<resultMap id="BaseResultMap" type="com.example.chapter3.model.Student">
<id column="student_id" property="studentId" />
<result column="student_name" property="studentName" />
<result column="student_age" property="studentAge" />
<result column="student_sex" property="studentSex" />
<result column="school_id" property="schoolId" />
<result column="class_id" property="classId" />
</resultMap>
<!-- 通用查詢結(jié)果列 -->
<sql id="Base_Column_List">
student_id, student_name, student_age, student_sex, school_id, class_id
</sql>
<resultMap type="com.example.chapter3.dto.StudentDto" id="stuDtoResultMap">
<id column="student_id" property="studentId" />
<result column="student_name" property="studentName" />
<result column="student_age" property="studentAge" />
<result column="student_sex" property="studentSex" />
<result column="school_id" property="schoolId" />
<result column="class_id" property="classId" />
<result column="shcool_name" property="shcoolName" />
<result column="class_name" property="className" />
<collection property="courses" ofType="com.example.chapter3.model.Course"
column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId">
</collection>
</resultMap>
<select id="selectStudentDetails" resultMap="stuDtoResultMap">
SELECT sc.school_name, sc.school_id, sc.adress, cl.class_id, cl.class_name, stu.student_id,
stu.student_name, stu.student_age, stu.student_sex FROM school sc LEFT JOIN class cl ON sc.school_id = cl.school_id
LEFT JOIN student stu ON stu.class_id = cl.class_id WHERE stu.student_id = #{studentId}
</select>
</mapper>其對(duì)應(yīng)的StudentMapper.class文件如下

該Mapper有一個(gè)查詢學(xué)生信息的方法對(duì)應(yīng)studentMapper.xml里的selectStudentDetails。
通過(guò)聯(lián)合查詢返回stuDtoResultMap,這是個(gè)resulMap類型,type="com.example.chapter3.dto.StudentDto"是學(xué)生的詳細(xì)信息實(shí)體類,其中的
<collection property="courses" ofType="com.example.chapter3.model.Course"
column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId">
</collection> 表示的是StudentDto的List集合,返回的是List<Course>,property是StudentDto類中的集合屬性名,也就是courses,ofType是集合中的類型,是Course, column是查詢傳遞的參數(shù),select是要查詢的語(yǔ)句,同一個(gè)Mapper直接使用id,不同Mapper使用查詢方法的全類名,這里把student_id作為參數(shù)傳遞給Course表的查詢函數(shù)selectCourseByStuId。
CourseMapper如下。

其對(duì)應(yīng)的Mapper文件如下

4.查詢學(xué)生詳細(xì)信息的service和controller



5.測(cè)試
訪問(wèn)請(qǐng)求localhost:8081/student/studentDetails/st001得到結(jié)果如下

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot打包不同環(huán)境配置以及shell腳本部署的方法
這篇文章主要給大家介紹了關(guān)于springboot打包不同環(huán)境配置以及shell腳本部署的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
SpringBoot Maven打包如何根據(jù)環(huán)境排除文件
文章介紹了在SpringBoot項(xiàng)目中,根據(jù)不同的環(huán)境(開(kāi)發(fā)、測(cè)試、生產(chǎn))進(jìn)行JSP文件打包處理的方法,通過(guò)配置`pom.xml`文件中的``標(biāo)簽,可以實(shí)現(xiàn)開(kāi)發(fā)環(huán)境保留`index.jsp`文件,測(cè)試環(huán)境和生產(chǎn)環(huán)境排除該文件2024-12-12
IDEA Error:java: 無(wú)效的源發(fā)行版: 17錯(cuò)誤
本文主要介紹了IDEA Error:java: 無(wú)效的源發(fā)行版: 17錯(cuò)誤,這個(gè)錯(cuò)誤是因?yàn)槟腎DEA編譯器不支持Java 17版本,您需要更新您的IDEA編譯器或者將您的Java版本降級(jí)到IDEA支持的版本,本文就來(lái)詳細(xì)的介紹一下2023-08-08

