spring Jackson仍然返回延迟获取字段的Json值

2izufjch  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(106)

我有一个具有OnetoOne关系的Student类。

public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "status_id")
    private StudentStatus statusID;

这是控制器:

public Page<StudentDTO> getAllStudents(@RequestParam(defaultValue = "0") int page,
                             @RequestParam(defaultValue = "10") int size,
                             @RequestParam(name = "filter", required = false) String fieldName,
                             @RequestParam(name = "value", required = false) String fieldValue) {
        Pageable pageable = PageRequest.of(page, size);
        Specification<Student> spec = StudentSpecification.hasFieldWithValueLike(fieldName,fieldValue);
        return studentService.getStudents(spec, pageable);}

售后服务:

public Page<StudentDTO> getStudents(Specification<Student> spec, Pageable pageable) {
    Page<Student> studentPage = studentRepository.findAll(spec, pageable);
    return studentPage.map(student -> studentMapper.toDTO(student));}

我知道我的lazy fetch是成功的,因为它返回了一个额外的字段:hibernateLazyInitializer
从我的理解来看,从GET返回的json不会有任何延迟获取字段StudentStatus的数据,但响应仍然有StudentStatus的所有值。
我还使用JMeter对10000个请求的API进行了基准测试。看起来没有lazy fetch,它实际上平均快了2ms。

nkhmeac6

nkhmeac61#

这正是Hibernate延迟加载的工作方式。StudentStatus将不会使用findAll方法获取。它只会被一个代理所取代。然而,在下一行中,Map器访问statusID字段的getter,导致Hibernate使用额外的select语句获取StudentStatus实体。这当然需要一些额外的时间。
如果您不需要StudentDTO中的StudentStatus,则可以将其从Map器中删除。

相关问题