首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Data JPA -规范查询

Spring Data JPA -规范查询
EN

Stack Overflow用户
提问于 2021-06-01 10:27:55
回答 2查看 64关注 0票数 0

有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

代码语言:javascript
运行
复制
List<Pupil> findByPupilInClassRoomTeacherName(String name);

尝试通过规范执行查询:

代码语言:javascript
运行
复制
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);
            }
        };
    }
}

我得到了错误:

代码语言:javascript
运行
复制
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]

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

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

基本实体:

代码语言:javascript
运行
复制
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
abstract class BaseModel {

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

protected BaseModel() {
  }
}

实体教师:

代码语言:javascript
运行
复制
@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() {
  }
}

实体瞳孔:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
@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() {

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-01 15:02:03

代码语言:javascript
运行
复制
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")

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

票数 0
EN

Stack Overflow用户

发布于 2021-06-01 15:32:29

问题的解决方案:

代码语言:javascript
运行
复制
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_

代码语言:javascript
运行
复制
@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";
}

呼叫规范:

代码语言:javascript
运行
复制
pupilRepository.findAll(PupilSpecification.findPupilByTeacherSpecification("Alla"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67782017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档