Запрос через EntityGraph и Specification при FetchType.EAGER
Есть Entity для которой я делаю граф:
@Entity
@Table(name = "teacher")
@NamedEntityGraph(name = "entity-graph",
attributeNodes = {@NamedAttributeNode(value = "classRoom",subgraph = "teacher-subgraph")},
subgraphs = {
@NamedSubgraph(name = "teacher-subgraph",attributeNodes = {
@NamedAttributeNode("teacher")})})
public final class Teacher extends BaseModel {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "teacher_id")
@Setter
@Getter
private ClassRoom classRoom;
Entity ClassRoom:
@Entity
@Table(name = "class_room")
public final class ClassRoom extends BaseModel {
@OneToMany(mappedBy = "classRoom", fetch = FetchType.EAGER)
@Getter
@Setter
private Set<Teacher> teacher = new HashSet<>();
@OneToMany(mappedBy = "classRoom",fetch = FetchType.EAGER)
@Getter
@Setter
private Set<Pupil> pupil = new HashSet<>();
Делаю запрос через спецификацию:
public class TeacherSpecification {
public static Specification<Teacher> findBy(String name) {
return new Specification<Teacher>() {
@Override
public Predicate toPredicate(Root<Teacher> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
root = criteriaQuery.from(Teacher.class);
criteriaQuery.distinct(true);
Join<Teacher, ClassRoom> teacherClassRoomJoin = root.join("classRoom");
return criteriaBuilder.equal(teacherClassRoomJoin.get(Teacher_.NAME),name);
}
};
}
В TeahcerRepository связываю граф:
public interface TeacherRepository extends CrudRepository<Teacher,Long>, JpaSpecificationExecutor<Teacher> {
List<Teacher> findByName(String name);
@EntityGraph(value = "entity-graph")
List<Teacher> findAll(Specification specification);
}
Тестирование запроса:
@Test
public void testFinal() {
Iterable<Teacher> findByFinal = teacherRepository.findAll(TeacherSpecification.findBy("Alla"));
findByFinal.forEach(c-> System.out.println(c.getClassRoom().getId() + " " + c.getClassRoom().getName()));
findByFinal.forEach(t-> System.out.println(t.getId() + " " + t.getSurname() + " " + t.getDiscipline()));
}
В консоль падает ошибка:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
Суть запроса, достать учителя, чтоб у него уже был класс загруженный через EAGER, где я допустил ошибку в логике?