我正在尝试使用带有外键数据的Rest Controller从Postgresql数据库中检索所有多对一关系数据。喜欢课程和讲师:
ssql = "SELECT * FROM tblProject"
da = New OleDb.OleDbDataAdapter(ssql, con)
da.Fill(ds, "UpdateCoverPage")
Dim cb2 As New Data.OleDb.OleDbCommandBuilder(da)
fill datatable here with data to be updated into ms access
da.Update(ds, "UpdateCoverPage")
我的代码如下:
{
{
"id": 1,
"course_name": "IT 101",
"instructor":{
"instructor_name":"Jack King"
}
},
{
"id": 2,
"course_name": "CS 101",
"instructor":{
"instructor_name":"Homer Love"
}
},
{
"id": 3,
"course_name": "DB 101",
"instructor":{
"instructor_name":"Jack King"
}
}
}
create table instructor
(
id integer generated always as identity,
instructor_name text,
primary key (instructor_name),
unique (id)
);
create table course
(
id integer generated always as identity,
course_name text not null,
instructor_fk integer references instructor (id),
primary key (course_name, instructor_fk),
unique (id)
);
insert into instructor (instructor_name) values ('Jack King');
insert into instructor (instructor_name) values ('Homer Love');
insert into author (course_name, instructor_fk) values ('IT 101', 1, 1);
insert into author (course_name, instructor_fk) values ('CS 101', 2, 2);
insert into author (course_name, instructor_fk) values ('DB 101', 3, 1);
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "course")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String course_name;
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH} )
@JsonIgnore
@JoinColumn(name = "instructor_fk", nullable = false)
private Instructor instructor;
}
@Entity
@Table(name = "instructor")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Instructor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String instructor_name;
@OneToMany(
mappedBy = "instructor",
cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
)
private List<Course> courses;
}
@Repository
public interface CourseRepository extends CrudRepository<Author, Integer> {
}
@Service
public class CourseService {
@Autowired
private CourseRepository courseRepository;
public List<Author> getAllCourses() {
return (List<Author>) courseRepository.findAll();
}
}
@RestController
public class CourseController {
@Autowired
private CourseService courseService;
@GetMapping("/courses")
private List<Author> getAllCourses() {
return courseService.getAllCourses();
}
}
答案 0 :(得分:0)
@JsonIgnore批注应该在一对多关系上,这意味着它应该在讲师实体上而不在课程实体上:
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "course")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String course_name;
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH} )
@JoinColumn(name = "instructor_fk", nullable = false)
private Instructor instructor;
}
@Entity
@Table(name = "instructor")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Instructor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String instructor_name;
@OneToMany(
mappedBy = "instructor",
cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
)
@JsonIgnore
private List<Course> courses;
}