Spring data JPA criteria query

Есть полностью рабочий запрос с применением выражения свойств:

public interface PupilRepository extends CrudRepository<Pupil,Long> {
    List<Pupil> findByPupilInClassRoomTeacherName(String name);
}

Пытаюсь выполнить тот же запрос через критерии:

    @Autowired
    private EntityManagerFactory emf;

    @Test
    public void findPupilBeTeacherCriteria() {
    EntityManager em = emf.createEntityManager();
    //em.getTransaction().begin();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Pupil> pupilCriteriaQuery = cb.createQuery(Pupil.class);
    Root<Pupil> pupilRoot = pupilCriteriaQuery.from(Pupil.class);
    Join<Pupil, PupilInClassRoom> pupil_PupilInClassRoomJoin = pupilRoot.join("pupil_id");
    Join<Teacher,PupilInClassRoom> teacher_PupilInClassRoomJoin = pupilRoot.join("teacher_id");
    pupilCriteriaQuery.select(pupilRoot);
    pupilCriteriaQuery.where(cb.equal(teacher_PupilInClassRoomJoin.get("name"),"Alla"));
    System.out.println(em.createQuery(pupilCriteriaQuery).getResultList());
}

Получаю ошибку:

java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [pupil_id] on this ManagedType [com.SchoolJournal.SpringHibernate.model.BaseModel]

Что я сделал не так или забыл добавить?

Базовая Entity:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
abstract class BaseModel {

@Id
@Column(name = "id")
@Getter
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

protected BaseModel() {
  }
}

Entity Teacher:

@Entity
@Table(name = "teacher")
public final class Teacher extends BaseModel {

@OneToOne
@JoinColumn(name = "teacher_id")
private PupilInClassRoom pupilInClassRoom;

@Column(nullable = false)
@Getter
@Setter
private String name;

@Column(nullable = false)
@Getter
@Setter
private String surname;

@Column(nullable = false)
@Getter
@Setter
private String discipline;

public Teacher() {
  }
}

Entity Pupil:

@Entity
@Table(name = "pupil")
public final class Pupil extends BaseModel {

@OneToOne
@JoinColumn(name = "pupil_id")
private PupilInClassRoom pupilInClassRoom;

@Column(nullable = false)
@Getter
@Setter
private String name;

@Getter
@Setter
@Column(nullable = false)
private String surname;

public Pupil() {

  }
}

Entity ClassRoom:

@Entity
@Table(name = "class_room")
public final class ClassRoom extends BaseModel {

@OneToOne
@JoinColumn(name = "class_Room_id")
private PupilInClassRoom pupilInClassRoom;

@Column(nullable = false)
@Getter
@Setter
private String name;

public ClassRoom() {
   }
}

Entity PupilInClassRoom:

@Entity
@Table(name = "pupil_in_class_room")
public final class PupilInClassRoom  extends BaseModel {

@OneToOne(mappedBy = "pupilInClassRoom")
@Getter
@Setter
private Pupil pupil;

@OneToOne(mappedBy = "pupilInClassRoom")
@Getter
@Setter
private ClassRoom classRoom;

@OneToOne(mappedBy = "pupilInClassRoom")
@Getter
@Setter
private Teacher teacher;

public PupilInClassRoom() {

}

Ответы (0 шт):