JeecgBoot3.61 实现实体类对象和请求参数映射构建查询,主要解决需要根据数据库外键展示相关信息的需求

JeecgBoot3.61 实现实体类对象和请求参数映射构建查询,主要解决需要根据数据库外键展示相关信息的需求

有一张表,例如有一张班级表,有一个外键叫teacher_id ,为教师表的主键,需要在班级列表展示班主任的姓名、年龄、性别

另外还有一张表是教师表,主要存放教师信息

此类需求关键的点在于,需要在班级实体类中去建立教师的一些展示信息,姓名、年龄、性别



前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、教师实体类

主要注解:@TableField(exist = false)
是MyBatis-Plus框架提供的注解之一,用于标识实体类中的字段在数据库表中不存在

@Data
@TableName("team_class")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="team_class对象", description="班级表")
public class TeamClass implements Serializable {
   
    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private String teacherName;
    @TableField(exist = false)
    private  Integer sex;
    @TableField(exist = false)
    private  Integer age;
}


二、Controller代码

示例代码如下:

/**
	 * 分页列表查询
	 *
	 * @param teamClass
	 * @param pageNo
	 * @param pageSize
	 * @param req
	 * @return
	 */
	//@AutoLog(value = "班级管理-分页列表查询")
	@ApiOperation(value="班级管理-分页列表查询", notes="班级管理-分页列表查询")
	@GetMapping(value = "/list")
	public Result<IPage<teamClass>> queryPageList(teamClass teamClass,
	@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
	@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
	HttpServletRequest req) {
   
		QueryWrapper<teamClass> queryWrapper = QueryGenerator.initQueryWrapper(teamClass, req.getParameterMap());
		// 判断前端页面是否传递了 reportTime 字段
		if (teamClass.getCreateTime() != null) {
   
			// 获取前端所选择的起始时间和结束时间
			Date startTime = DateUtils.getBeginOfDay(teamClass.getCreateTime());
			Date endTime = DateUtils.getEndOfDay(teamClass.getCreateTime());

			// 添加大于等于起始时间的条件
			queryWrapper.ge("create_time", startTime);
			// 添加小于等于结束时间的条件
			queryWrapper.le("create_time", endTime);
		} else {
   
			// 获取当天的起始时间和结束时间
			Date startTime = DateUtils.getBeginOfDay(new Date());
			Date endTime = DateUtils.getEndOfDay(new Date());

			// 添加大于等于起始时间的条件
			queryWrapper.ge("create_time", startTime);
			// 添加小于等于结束时间的条件
			queryWrapper.le("create_time", endTime);
		}
		Page<teamClass> page = new Page<teamClass>(pageNo, pageSize);
		page.addOrder(OrderItem.desc("create_time"));
		IPage<teamClass> pageList = teamClassService.page(page, queryWrapper);
		List<teamClass> records = pageList.getRecords();
		for (teamClass report : records) {
   
			// 根据 patientid 查询人员信息
			if (StringUtils.isNotBlank(report.getTeacherId())) {
   
				// 假设你要查询的实体类为 Teracher,根据具体情况修改
				Teracher Teracher = teamClassService.getById(report.getTeacherId());

				// 将查询到的人员信息并赋值
				if (Teracher != null) {
   
					report.setTeacherName(Teracher.getTeacherName());
					report.setSex(Teracher.getSex());
					Date birthdy = Teracher.getBirthday();
					int age = CommonUtils.calculateAge(birthdy);
					report.setAge(age);
				}
			}
		}
		return Result.OK(pageList);
	}

下面是对代码的关键解析

方法签名:该方法使用GET请求方式,路径为/list,接收的参数包括teamClass对象、pageNo(当前页码,默认为1)和pageSize(每页记录数,默认为10),以及HttpServletRequest对象。

@GetMapping(value = "/list")
public Result<IPage<teamClass>> queryPageList(teamClass teamClass,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req)

查询条件构建:通过调用QueryGenerator.initQueryWrapper方法,根据teamClass对象和请求参数映射构建了一个查询条件的QueryWrapper对象。

QueryWrapper<teamClass> queryWrapper = QueryGenerator.initQueryWrapper(teamClass, req.getParameterMap());

时间条件处理:
根据传入的teamClass对象中的createTime字段,判断是否存在起始时间条件。如果存在,则根据起始时间和结束时间添加相应的查询条件。如果不存在,则默认使用当天的起始时间和结束时间作为查询条件。

分页查询:创建一个Page对象,指定当前页码和每页记录数,并添加一个按照create_time字段降序排序的排序条件。然后,通过调用teamClassService的page方法执行分页查询,将查询结果赋值给pageList。

Page<teamClass> page = new Page<teamClass>(pageNo, pageSize);
page.addOrder(OrderItem.desc("create_time"));
IPage<teamClass> pageList = teamClassService.page(page, queryWrapper);

关联查询:
在获取到的班级列表中,对每个班级进行循环遍历,并根据teacherId字段查询对应的教师信息。然后,将查询到的教师信息赋值给班级对象的相应字段。

返回结果:将查询到的分页结果包装成Result对象并返回。

return Result.OK(pageList);

DateUtils.java:

public class DateUtils extends PropertyEditorSupport {
   
    public static Date getBeginOfDay(Date date) {
   
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    public static Date getEndOfDay(Date date) {
   
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }
}

CommonUtils.java

/**
 * @Description: 通用工具
 * @author: jeecg-boot
 */
@Slf4j
public class CommonUtils {
   
    /**
     * 根据生日查询年龄
     * @param birthday
     * @return
     */
    public static int calculateAge(Date birthday) {
   
        LocalDate birthDate = birthday.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate currentDate = LocalDate.now();
        Period period = Period.between(birthDate, currentDate);
        return period.getYears();
    }
}

三、前端代码:TeamClass.data.ts

import {
    BasicColumn } from '/@/components/Table';
import {
    FormSchema } from '/@/components/Table';
import {
    useMessage } from '@/hooks/web/useMessage';
//列表数据
// @ts-ignore
export const columns: BasicColumn[] = [
  {
   
    title: '姓名',
    align: 'center',
    dataIndex: 'teacherName',
  },
  {
   
    title: '性别',
    align: 'center',
    // dataIndex: 'sex_dictText', 此代码未生效
    dataIndex: 'sex',
    customRender: ({
    value }) => {
   
      return new Object({
    1: '男', 2: '女' })[value];
    },
  },
  {
   
    title: '年龄',
    align: 'center',
    dataIndex: 'age',
  },
];
//查询数据
export const searchFormSchema: FormSchema[] = [
  {
   
    label: '报告生成日期',
    field: 'createTime',
    component: 'DatePicker', // 时间选择器改为单个日期选择器
    componentProps: {
   
      valueType: 'Date',
      valueFormat: 'YYYY-MM-DD', // 可选,绑定值的格式
      showTime: false, // 不显示时间,只选择单个日期
    },
  },
];

/**
 * 流程表单调用这个方法获取formSchema
 * @param param
 */
export function getBpmFormSchema(_formData): FormSchema[] {
   
  // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
  return formSchema;
}

下面是对代码的关键解析

导入组件和钩子函数:该代码段导入了BasicColumn和FormSchema组件,这些组件可能是用于构建表格和表单的通用组件。同时,还导入了useMessage钩子函数,用于处理消息提示。

import {
    BasicColumn } from '/@/components/Table';
import {
    FormSchema } from '/@/components/Table';
import {
    useMessage } from '@/hooks/web/useMessage';

列表数据定义:columns是一个定义列表列的数组。每个列对象包含title(标题)、align(对齐方式)、dataIndex(数据索引)等属性。其中,dataIndex指定了对应数据的字段名,例如teacherName、sex和age。在第二列中,使用了customRender属性来自定义渲染单元格的内容,根据value的值返回对应的性别文本。

export const columns: BasicColumn[] = [
  {
   
    title: '姓名',
    align: 'center',
    dataIndex: 'teacherName',
  },
  {
   
    title: '性别',
    align: 'center',
    // dataIndex: 'sex_dictText', 此代码未生效
    dataIndex: 'sex',
    customRender: ({
    value }) => {
   
      return new Object({
    1: '男', 2: '女' })[value];
    },
  },
  {
   
    title: '年龄',
    align: 'center',
    dataIndex: 'age',
  },
];

查询数据定义:searchFormSchema是一个定义查询表单的数组。每个表单项对象包含label(标签)、field(字段名)和component(组件类型)等属性。在这里,使用了DatePicker组件作为报告生成日期的选择器,并通过componentProps属性进行了一些配置,如valueType(绑定值的类型为日期)、valueFormat(绑定值的格式为YYYY-MM-DD)和showTime(不显示时间,只选择单个日期)。

export const searchFormSchema: FormSchema[] = [
  {
   
    label: '报告生成日期',
    field: 'createTime',
    component: 'DatePicker', // 时间选择器改为单个日期选择器
    componentProps: {
   
      valueType: 'Date',
      valueFormat: 'YYYY-MM-DD', // 可选,绑定值的格式
      showTime: false, // 不显示时间,只选择单个日期
    },
  },
];

getBpmFormSchema方法:getBpmFormSchema是一个方法,用于获取表单的FormSchema数组。在这个示例中,该方法返回了一个未定义的formSchema变量,因为我在表单数据中引用了,代码此处没放,主要用于详情、编辑、新增使用。

export function getBpmFormSchema(_formData): FormSchema[] {
   
  // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
  return formSchema;
}

总结

道阻且长,一起加油哦!!!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-26 19:18:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-26 19:18:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-26 19:18:04       82 阅读
  4. Python语言-面向对象

    2024-01-26 19:18:04       91 阅读

热门阅读

  1. 【Spring】服务启动后指定命令实现方法

    2024-01-26 19:18:04       59 阅读
  2. C++实现模版模式 + 创建者模式的demo

    2024-01-26 19:18:04       50 阅读
  3. ffmpeg 实用命令 -- 设置预览图

    2024-01-26 19:18:04       53 阅读
  4. 每日OJ题_算法_二分查找③_力扣69. x 的平方根

    2024-01-26 19:18:04       58 阅读
  5. IDEA使用快捷键提炼函数(Extract Method)

    2024-01-26 19:18:04       49 阅读
  6. 字符串随机生成工具(开源)-Kimen(奇门)

    2024-01-26 19:18:04       48 阅读