Как избежать дочерних дочерних объектов в Spring JPA?

Я использую Spring JPA. У меня есть три объекта: Student, ClassRoom и School, как показано ниже

@Entity
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="name")
    private int age;

    ...
}

@Entity
public class ClassRoom implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name="id")
    private List<Student> students;

    ...
}

@Entity
public class School implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @OneToMany
    @JoinColumn(name="id")
    private List<ClassRoom> classRooms;

    ...
}

Сейчас я выбираю школу с подробностями ClassRoom, и мне не нужны данные учеников.

Но для объекта Student в ClassRoom установлено значение EAGER Fetch Type. Как я могу получить школьные записи с записями ClassRoom без студенческих записей.

Примечание. Я не могу удалить FetchType.EAGER в Student Entity.

1 ответ

Вам нужно будет создать собственный репозиторий, а затем создать метод внутри либо с помощью реализации этого интерфейса, либо создать метод default, Вот пример того, как эти методы могут выглядеть (при условии, что вы идете по пути реализации):

public class SchoolRepositoryImpl implements SchoolRepository {

    @Autowired
    EntityManager em;

    public List<School> getSchoolById(Long schoolId) {
           Query q = em.createNativeQuery("select...");
           q.setParameter("schoolId", schoolId);
           List<Object[]> results = q.getResultAsList();
           return this.mapSchool(results);
    }

    private List<School> mapSchool(List<Object[]> entities){
            List<School> schools = new ArrayList<>();
            for(Object[] o : entities){
                  school s = new School();
                  s.set...
                  s.set...
                  schools.add(s);
            }
            return schools;
    }
}
Другие вопросы по тегам