java Sping Boot 规范root的fetch函数,用于连接列对性能的影响

hec6srdp  于 7个月前  发布在  Java
关注(0)|答案(1)|浏览(51)

假设我有一个Sping 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;
}

字符串
现在,如果我想在我的项目中使用Specifications来创建如下所示的可配置报表,下面两个“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());
    }
}

txu3uszq

txu3uszq1#

一般来说,我不会过早地担心性能,除非你注意到请求花费了很长时间。我个人在使用Sping Boot /Hibernate时不使用CriteriaBuilder,因为与只使用JPQL或SQL相比,语句变得非常冗长,但最终真正影响性能的是查询结果。对于你的两个选项来说,这些可能是一样的。
如果你想检查这个,你可以监视你的数据库上的查询,或者把它放在你的application.properties中:
spring.jpa.show-sql=true
所以你可以看到生成了什么样的SQL。
请注意,Hibernate本身的一个一般提示是,当您只想将实体导出为视图时,不要使用实体。
对于像这样一个相当简单的查询,一个ManyToOne连接和一个OneToMany连接,我不认为整体性能会那么糟糕。一旦你开始连接多个关联,那就是你可能应该开始将查询分为主表查询和关联数据表查询的时候。

相关问题