Java Spring数据JPA-规范查询

Java Spring数据JPA-规范查询,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,有一个使用属性表达式的查询:: 我做错了什么或忘记添加了什么 查询:按教师姓名显示所有学生 基本实体: @Entity @Inheritance(strategy = InheritanceType.JOINED) abstract class BaseModel { @Id @Column(name = "id") @Getter @GeneratedValue(strategy = GenerationType.AUTO) private long id; prote

有一个使用属性表达式的查询::

我做错了什么或忘记添加了什么

查询:按教师姓名显示所有学生

基本实体:

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

}
实体教室:

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

}
Join瞳孔\u瞳孔classroomjoin=
root.join(“pupilin教室”);
加入教师\学生班级加入=
学生们在教室里加入。加入(“老师”);
root.join(“学生id”)
->
root.join(“学生id”)

加入
->
加入

pupliClassRoomJoin.join(“教师id”)
->
pupliClassRoomJoin.join(“教师”)


上面的更新是我猜做你想做的事情所需要的。可以尝试吗?

问题的解决方案:

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);
                }
            };
        }
    }

是的,你的回答解决了我的问题)谢谢。你做得怎么样。加入(课堂)和。加入(老师)?我添加了元模型)
Join<Pupil, PupilInClassRoom>   pupil_PupilInClassRoomJoin   =
        root.join("pupilInClassRoom");
Join<PupilInClassRoom, Teacher> teacher_PupilInClassRoomJoin = 
        pupil_PupilInClassRoomJoin.join("teacher");
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);
                }
            };
        }
    }
@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"))