You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot接口返回TblDepartments关联字段为null问题咨询

问题根因

  • 你的TblEmployees实体仅存储了外键dbID的数值,没有配置和TblDepartments的关联关系,JPA执行findAll查询时不会自动查询关联的部门数据,返回的员工实体中根本没有部门相关的属性,ModelMapper自然无法映射出dep_name的值
  • 两个实体类都缺少必要的JPA注解、Get/Set方法,且当前的ModelMapper没有配置跨实体的映射规则
  • 代码中存在多处拼写错误(如Service类名、Repository注入名),也可能影响运行逻辑

解决步骤

1. 修正实体类配置,添加关联关系

首先给TblDepartments添加主键注解,同时在TblEmployees中配置多对一关联,替代原来单独的dbID字段:

// TblDepartments 实体
@Entity
public class TblDepartments {
    @Id
    private Integer dbID;
    private String dep_name;
    // 补全所有属性的Getter、Setter方法
}
// TblEmployees 实体
@Entity
public class TblEmployees {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int emp_id;
    private String empName;
    private Boolean empActive;
    // 配置和部门表的关联关系
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dbID") // 和数据库中外键字段名保持一致
    private TblDepartments department;
    // 补全所有属性的Getter、Setter方法
}

Employees_DTO保持原有结构即可,同样需要补全所有属性的Getter、Setter方法。

2. 配置ModelMapper的跨实体映射规则

将ModelMapper的全局配置放到Bean初始化的位置,避免每次转换重复设置,同时添加映射规则,将关联部门的dep_name映射到DTO的对应字段:

// 放到项目的配置类中,不要写在Service里
@Bean
public ModelMapper modelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
    // 配置员工实体转DTO的映射规则
    modelMapper.typeMap(TblEmployees.class, Employees_DTO.class)
            .addMapping(src -> src.getDepartment().getDep_name(), Employees_DTO::setDep_name);
    return modelMapper;
}

3. 调整Repository查询逻辑,避免懒加载异常

默认@ManyToOne使用懒加载策略,查询员工时不会主动加载部门数据,需要通过EntityGraph指定关联加载:

public interface EmployeesRepository extends JpaRepository<TblEmployees, Integer> {
    @EntityGraph(attributePaths = "department")
    @Override
    List<TblEmployees> findAll();
}

4. 修正Service层拼写错误

Service类名EmployessServise修正为EmployeesService,注入的Repository类名修正为正确的EmployeesRepository,删除重复的转换方法命名(现有代码中两个方法都叫convertEntityToDto,会编译报错),调整后的Service代码示例:

@Service
public class EmployeesService {
    @Autowired
    private EmployeesRepository repo;

    @Autowired
    private ModelMapper modelMapper;

    public List<Employees_DTO> getAll_Emp(){
        return repo.findAll()
                .stream()
                .map(this::convertEntityToDto)
                .collect(Collectors.toList());
    }

    private Employees_DTO convertEntityToDto(TblEmployees tblEmployees){
        return modelMapper.map(tblEmployees, Employees_DTO.class);
    }

    // 转换DTO到实体的方法改名避免冲突
    private TblEmployees convertDtoToEntity(Employees_DTO employees_dto){
        return modelMapper.map(employees_dto, TblEmployees.class);
    }
}

内容的提问来源于stack exchange,提问作者robot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:27:02