java—尝试从多个表中使用SpringDataJPA从数据库中获取自定义对象数据

bis0qfac  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(234)

我想从多个表中获取数据。

public class Student{
    private int id;
    private String name;
    private List<Course> course;
}

public class Course{
    private int id;
    private String name;
    private int studentId;
}

我想使用springdatajpa从student和course表中获取数据并Map到student对象。我怎样才能有效地做到这一点?

ego6inou

ego6inou1#

@Data
@NoArgsConstructor
public class Student{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    @OneToMany(mappedBy="studentId",cascade=CascadeType.ALL,fetch=FetchType.Eager) 
    private Set<Course> course;
}

你可以用set代替list。
总是在一个区域使用mapped by,如果在多个区域使用mapped by,它将创建一个额外的表。
您可以使用fetch类型eager或lazy。默认情况下,它是lazy,您必须使用@transactional of lazy。

@Data
    @NoArgsConstructor
    public class Course{
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private int id;
        private String name;
        @ManyToOne
        @JoinColumn(name="studentId") 
        private int studentId;
    }

希望这个答案能解决你的疑问!。

ukdjmx9f

ukdjmx9f2#

请注意,起点可能是错误的。我假设一个学生可以选择多个课程,一个课程可以由多个学生选择。所以它实际上是一个 @ManyToMany 关系,但不是 @ManyToOne 或者 @OneToMany .
您肯定需要一个联合表来将它们的主键从两个表Map到联合表中。

@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @EqualsAndHashCode.Exclude
    @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinTable(
            name = "courses",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set<Course> courses;
}
@Entity
@Data
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @JsonIgnore
    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    @ManyToMany(mappedBy = "courses",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private Set<Student> students;
}

注意这里所有的修改。
对于保存到数据库中的数据, Long 是一个比 int . 类似地,例如,使用 Boolean 而不是 boolean .
想想 Student 作为管理多对多关系的一方 Course 作为目标方。在目标端,使用 @JsonIgnore 以及 @ToString.Exclude 注解以避免无限递归、stackoverflow或oom。

@JsonIgnore
    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    @ManyToMany(mappedBy = "courses",fetch = FetchType.EAGER,cascade = CascadeType.ALL)

使用 Set 而不是 List 如果一个学生不应该选择完全相同的课程。它确保人们仍然可以选择 2017 fall Maths 以及 2018 fall Maths ,而不能选择 2017 fall Maths 两次。

相关问题