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() {
}