Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-26-招聘海报列表显示修复.md
T
2025-07-26 15:29:31 +08:00

6.6 KiB
Raw Blame History

招聘海报列表显示问题修复记录

📋 基本信息

项目 信息
变更日期 2025-01-26
变更时间 15:20:00
变更人员 Cursor AI
变更类型 错误修复
影响模块 招生就业-招聘海报管理
变更状态 ✅ 完成

🎯 问题描述

用户反馈招聘海报列表存在问题:

  1. 企业名称显示异常:列表中企业名称没有正确显示出来
  2. 关联岗位显示异常:岗位名称也没有正确显示出来

🔍 根因分析

问题根源(与招聘岗位问题完全一致)

  • 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个)

  1. backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyRecruitmentPosterMapper.xml

    • 添加自定义分页查询方法:selectRecruitmentPosterPageList
    • 添加自定义非分页查询方法:selectRecruitmentPosterVoList
    • 确保JOIN查询包含企业表和岗位表
    • 添加参数空值检查:bo != null and bo.enterpriseId != null
  2. backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyRecruitmentPosterMapper.java

    • 添加导入:IPage、Page、@Param、ZsjyRecruitmentPosterBo
    • 添加分页查询方法声明:selectRecruitmentPosterPageList
    • 添加非分页查询方法声明:selectRecruitmentPosterVoList
    • 使用@Param注解避免参数绑定问题
  3. 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. 数据完整性验证

  • 验证企业海报的企业名称显示
  • 验证岗位海报的企业名称和岗位名称显示
  • 确认海报类型正确显示
  • 测试筛选功能

📝 技术总结

关键技术点(基于招聘岗位修复经验)

  1. MyBatis-Plus vs 自定义查询:

    • MyBatis-Plus的 selectVoPage 和 selectVoList 只适用于单表查询
    • 涉及关联查询时必须使用自定义Mapper方法
  2. MyBatis参数绑定规则:

    • 多参数方法中,XML需要通过参数名访问:bo.字段名
    • 可用参数列表:[page, bo, param1, param2]
    • 类型转换:自定义方法返回IPage而非Page
  3. 关联查询设计:

    • 正确的JOIN语法:left join 确保主表数据完整
    • 字段映射:XML中的column名必须与SQL查询字段名一致
    • 结果映射:resultMap正确映射关联字段

最佳实践

  1. 数据查询:涉及关联查询的业务场景,优先使用自定义Mapper方法
  2. 参数传递:使用@Param注解明确参数名,避免绑定错误
  3. 方法命名:使用清晰的方法名区分分页和非分页查询
  4. 测试验证:修复后必须进行全面的功能验证

🔗 相关文档