有一个使用属性表达式的查询: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() {
}
}实体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() {
}
}实体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() {
}发布于 2021-06-01 15:02:03
Join<Pupil, PupilInClassRoom> pupil_PupilInClassRoomJoin =
root.join("pupilInClassRoom");
Join<PupilInClassRoom, Teacher> teacher_PupilInClassRoomJoin =
pupil_PupilInClassRoomJoin.join("teacher");root.join("pupil_id") -> root.join("pupilInClassRoom")
Join<Teacher, PupilInClassRoom> -> Join<PupilInClassRoom, Teacher>
pupil_PupilInClassRoomJoin.join("teacher_id") -> pupil_PupilInClassRoomJoin.join("teacher")
上面的更新是我猜需要做你想要的。可以试试吗?
发布于 2021-06-01 15:32:29
问题的解决方案:
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("pupilInClassRoom");
Join<PupilInClassRoom, Teacher> teacher_PupilInClassRoomJoin = pupil_PupilInClassRoomJoin.join("teacher");
return criteriaBuilder.equal(teacher_PupilInClassRoomJoin.get(Teacher_.Name),name);
}
};
}
}并添加元模型Teacher_
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Teacher.class)
public abstract class Teacher_ {
public static volatile SingularAttribute<Teacher,String> name;
public static volatile SingularAttribute<Teacher,String> surmane;
public static volatile SingularAttribute<Teacher,String> discipline;
public static volatile SingularAttribute<BaseModel,Integer> id;
public static final String Name = "name";
public static final String Surname = "surname";
public static final String Discipline = "discipline";
public static final String Id = "id";
}呼叫规范:
pupilRepository.findAll(PupilSpecification.findPupilByTeacherSpecification("Alla"))https://stackoverflow.com/questions/67782017
复制相似问题