【问题标题】:Limit JPA Specification query to fetch required data限制 JPA 规范查询以获取所需数据
【发布时间】:2020-05-12 13:59:54
【问题描述】:

我有 3 张桌子:

School
    school_id, school_name, student_id
Student
    student_id, student_name ,subject_id
Subject
    subject_id, subject_name

School -> Student -> Subject 之间存在一对多关系,我只在该关系中创建了实体。

我正在编写specification 查询来获取特定学校的学生:

List<Student> students = schoolRepo.findAll(Specification.where (findStudents(schoolId));

public static Specification<Student> findStudents(long schoolId) {
    return (root, query, cbuilder) -> {
        root.fetch("students", JoinType.LEFT);
        return cbuilder.and(cbuilder.equal(root.get("school"), schoolId));
    };
}

虽然我没有在规范查询或代码中的任何地方获取主题(例如使用get)。

我仍然可以在生成的查询的日志中看到主题最终会被获取。

如何更新我的查询以仅限于学校和学生?

请提出建议。

【问题讨论】:

    标签: java jpa specifications


    【解决方案1】:

    您可以尝试改用 EntityGraph。它有助于提高加载实体的性能。你可以这样做

    @Entity
    @NamedEntityGraph (
      name="school-students",
      attributeNodes = {
         @NamedAttributeNode("students")
      }
    )
    public class School implements Serializable { ... }
    
    
    And then in your repository use it like this : 
    
    @Override
    @EntityGraph(value = "school-students",
         type = EntityGraph.EntityGraphType.FETCH)
    @Query( value = "SELECT s FROM School s where s.id =:id")
    School findOne();
    

    【讨论】:

      猜你喜欢
      • 2015-06-03
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2019-05-10
      相关资源
      最近更新 更多