6.6 KiB
6.6 KiB
招聘海报列表显示问题修复记录
📋 基本信息
| 项目 | 信息 |
|---|---|
| 变更日期 | 2025-01-26 |
| 变更时间 | 15:20:00 |
| 变更人员 | Cursor AI |
| 变更类型 | 错误修复 |
| 影响模块 | 招生就业-招聘海报管理 |
| 变更状态 | ✅ 完成 |
🎯 问题描述
用户反馈招聘海报列表存在问题:
- 企业名称显示异常:列表中企业名称没有正确显示出来
- 关联岗位显示异常:岗位名称也没有正确显示出来
🔍 根因分析
问题根源(与招聘岗位问题完全一致)
- Service层使用默认方法:使用了MyBatis-Plus的默认
selectVoPage和selectVoList方法 - 单表查询限制:默认方法只查询单表,无法执行Mapper.xml中定义的JOIN查询
- 关联数据缺失:虽然XML中正确定义了关联查询SQL,但实际查询时没有使用
XML中的正确JOIN查询
from zsjy_recruitment_poster r
left join zsjy_enterprise e on r.enterprise_id = e.id
left join zsjy_job_position p on r.position_id = p.id
Service中的问题代码
// 问题:使用默认方法,不执行JOIN查询
Page<ZsjyRecruitmentPosterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return baseMapper.selectVoList(lqw);
🔧 修复方案
参考招聘岗位修复经验
1. 在Mapper.xml中添加自定义查询方法
分页查询方法:
<select id="selectRecruitmentPosterPageList" resultMap="ZsjyRecruitmentPosterResult">
<include refid="selectZsjyRecruitmentPosterVo"/>
<where>
r.deleted = 0
<if test="bo != null and bo.enterpriseId != null">
and r.enterprise_id = #{bo.enterpriseId}
</if>
<if test="bo != null and bo.positionId != null">
and r.position_id = #{bo.positionId}
</if>
<if test="bo != null and bo.posterType != null and bo.posterType != ''">
and r.poster_type = #{bo.posterType}
</if>
</where>
order by r.create_time desc
</select>
非分页查询方法:
<select id="selectRecruitmentPosterVoList" parameterType="org.dromara.zsjy.domain.bo.ZsjyRecruitmentPosterBo" resultMap="ZsjyRecruitmentPosterResult">
<!-- 类似结构,但参数引用不同 -->
</select>
2. 在Mapper接口中添加方法声明
/**
* 分页查询招聘海报列表(包含企业名称和岗位名称)
*/
IPage<ZsjyRecruitmentPosterVo> selectRecruitmentPosterPageList(@Param("page") Page<?> page, @Param("bo") ZsjyRecruitmentPosterBo bo);
/**
* 查询招聘海报列表(包含企业名称和岗位名称)- 非分页
*/
List<ZsjyRecruitmentPosterVo> selectRecruitmentPosterVoList(ZsjyRecruitmentPosterBo bo);
3. 更新Service实现
// 修复前:使用默认方法(无JOIN查询)
Page<ZsjyRecruitmentPosterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 修复后:使用自定义方法(包含JOIN查询)
IPage<ZsjyRecruitmentPosterVo> result = baseMapper.selectRecruitmentPosterPageList(pageQuery.build(), bo);
📊 修复详情
修改的文件列表
后端文件 (3个)
-
backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyRecruitmentPosterMapper.xml- 添加自定义分页查询方法:
selectRecruitmentPosterPageList - 添加自定义非分页查询方法:
selectRecruitmentPosterVoList - 确保JOIN查询包含企业表和岗位表
- 添加参数空值检查:
bo != null and bo.enterpriseId != null
- 添加自定义分页查询方法:
-
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyRecruitmentPosterMapper.java- 添加导入:IPage、Page、@Param、ZsjyRecruitmentPosterBo
- 添加分页查询方法声明:
selectRecruitmentPosterPageList - 添加非分页查询方法声明:
selectRecruitmentPosterVoList - 使用@Param注解避免参数绑定问题
-
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyRecruitmentPosterServiceImpl.java- 添加导入:IPage
- 更新分页查询:使用
selectRecruitmentPosterPageList - 更新列表查询:使用
selectRecruitmentPosterVoList - 移除buildQueryWrapper的依赖
关联数据显示
| 显示字段 | 数据来源 | 修复前 | 修复后 |
|---|---|---|---|
| 企业名称 | zsjy_enterprise.enterprise_name |
❌ 空值 | ✅ 正确显示 |
| 岗位名称 | zsjy_job_position.position_name |
❌ 空值 | ✅ 正确显示 |
| 海报类型 | 字典转换显示 | ✅ 正常 | ✅ 保持 |
| 基础信息 | 主表数据 | ✅ 正常 | ✅ 保持 |
✅ 验证步骤
1. 编译验证
- 重新编译项目:
mvn clean compile -pl ruoyi-modules/ruoyi-zsjy -am - 确保编译无错误
2. 服务重启
- 重启后端服务
- 确保服务正常启动
3. 功能验证
- 访问招聘海报列表页面
- 确认企业名称列正确显示企业名称
- 确认岗位名称列正确显示岗位名称
- 验证搜索功能正常工作
- 确认分页功能正常
4. 数据完整性验证
- 验证企业海报的企业名称显示
- 验证岗位海报的企业名称和岗位名称显示
- 确认海报类型正确显示
- 测试筛选功能
📝 技术总结
关键技术点(基于招聘岗位修复经验)
-
MyBatis-Plus vs 自定义查询:
- MyBatis-Plus的
selectVoPage和selectVoList只适用于单表查询 - 涉及关联查询时必须使用自定义Mapper方法
- MyBatis-Plus的
-
MyBatis参数绑定规则:
- 多参数方法中,XML需要通过参数名访问:
bo.字段名 - 可用参数列表:
[page, bo, param1, param2] - 类型转换:自定义方法返回
IPage而非Page
- 多参数方法中,XML需要通过参数名访问:
-
关联查询设计:
- 正确的JOIN语法:
left join确保主表数据完整 - 字段映射:XML中的column名必须与SQL查询字段名一致
- 结果映射:resultMap正确映射关联字段
- 正确的JOIN语法:
最佳实践
- 数据查询:涉及关联查询的业务场景,优先使用自定义Mapper方法
- 参数传递:使用@Param注解明确参数名,避免绑定错误
- 方法命名:使用清晰的方法名区分分页和非分页查询
- 测试验证:修复后必须进行全面的功能验证