Spring Boot 规范 root 用于连接列的获取函数对性能的影响

问题描述 投票:0回答:1

假设我有一个结构如下所示的 Spring Boot 项目,我在其中存储 Campus 详细信息,其中有很多员工。此外,许多员工也只是一个部门的一部分,即部门是一个主数据实体。

public class Campus {
    @Id
    private String campusNo;

    @JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee")
    private List<Employee>employeeList = new ArrayList<>();
}

public class Employee {
    @Id
    private String employeeCode;

    @JsonBackReference
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "campusNo", nullable = false)
    private Campus campus;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(referencedColumnName = "departMentNo")
    private Department department;
}

public class Department {
    @Id
    private String departMentNo;
}

现在,如果我想在项目中使用规范来创建如下所示的可配置报告,那么下面两个“fetch()”语句(标记为 Option 1Option 2)中的哪一个将有助于提高性能(减少“select”语句的数量),为什么?他们俩都工作。我只想知道每个陈述的优点和缺点(如果有的话)。

public class CampusSpecification implements Specification<Campus> {
    private SearchCriteria searchCriteria;

    @Override
    public Predicate toPredicate(Root<Campus> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
        root.fetch("employeeList").fetch("department"); // Option 1
        root.fetch("employeeList"); // Option 2
        return criteriaBuilder.in(root.get("employeeList").get("department").get("departMentNo")).value(searchCriteria.getValue());
    }
}
java spring-boot hibernate spring-data-jpa criteria-api
1个回答
0
投票

一般来说,我不会过早担心性能,除非您注意到请求花费了很长时间。我个人在使用 Spring Boot/Hibernate 时不会使用 CriteriaBuilder,因为与仅使用 JPQL 或 SQL 相比,语句变得非常冗长,但最终对性能真正重要的是由此产生的查询。对于您的两个选择来说,这些很可能是相同的。

如果您想检查这一点,您可以监视数据库上的查询,或者将其放入您的

application.properties

spring.jpa.show-sql=true

这样就可以看到生成了什么样的SQL。

请注意,Hibernate 本身的一般提示是,当您只想将实体导出为视图时,不要使用实体。

© www.soinside.com 2019 - 2024. All rights reserved.