【发布时间】:2021-06-01 02:27:55
【问题描述】:
有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions:
List<Pupil> findByPupilInClassRoomTeacherName(String name);
尝试通过规范执行查询:
public final class PupilSpecification {
public static Specification<Pupil> findPupilByTeacherSpecification(String name) {
return new Specification<Pupil>() {
@Override
public Predicate toPredicate(Root<Pupil> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
root = criteriaQuery.from(Pupil.class);
Join<Pupil, PupilInClassRoom> pupil_PupilInClassRoomJoin = root.join("pupil_id");
Join<Teacher, PupilInClassRoom> teacher_PupilInClassRoomJoin = pupil_PupilInClassRoomJoin.join("teacher_id");
return criteriaBuilder.equal(teacher_PupilInClassRoomJoin.get("name"),name);
}
};
}
}
我得到错误:
org.springframework.dao.InvalidDataAccessApiUsageException: Unable to locate Attribute with the the given name [pupil_id] on this ManagedType [com.SchoolJournal.SpringHibernate.model.BaseModel]; nested exception is java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [pupil_id] on this ManagedType [com.SchoolJournal.SpringHibernate.model.BaseModel]
我做错了什么或忘记添加?
查询:按教师姓名显示所有学生
基础实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
abstract class BaseModel {
@Id
@Column(name = "id")
@Getter
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
protected BaseModel() {
}
}
实体老师:
@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
@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
@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() {
}
}
实体 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() {
}
【问题讨论】:
标签: java spring spring-data-jpa