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;
}
总结
道阻且长,一起加油哦!!!