我創建了一個包含演員、電影和類別物體的 API。演員和電影通過映射到名為movie_actor的連接表的多對多關系連接,類別通過一對多關系與電影連接。
我正在嘗試撰寫一個本機查詢,該查詢回傳一個整數,該整數表示特定演員播放過的特定類別的電影數量,例如,如果演員在 2 部不同的科幻電影中播放,查詢將回傳 2。從資料庫級別執行此操作沒有問題,我可以看到連接表movie_actor,但該表在我的api中仍然無法訪問,因為它不是一個單獨的物體。如何創建它以自動將演員和電影 ID 映射為 movie_actor 表?
這是在 H2 資料庫中為我作業的示例代碼:
SELECT COUNT(*) FROM MOVIE M JOIN MOVIE_ACTOR MA on M.MOVIE_ID = MA.MOVIE_ID WHERE ACTOR_ID = 1 AND CATEGORY_ID = 1
這是我的物體:
演員:
@Entity
@Data
@Table(name = "actor")
@AllArgsConstructor
@NoArgsConstructor
public class Actor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "actor_id")
private long actorId;
@Column(name = "name")
private String name;
@Column(name = "surname")
private String surname;
@Nullable
@ManyToMany(mappedBy = "actors", fetch = FetchType.EAGER)
@JsonBackReference
private List<Movie> movies = new ArrayList<>();
public Actor(String name, String surname){
this.name = name;
this.surname = surname;
}
}
電影:
@Entity
@Data
@Table(name = "movie")
@AllArgsConstructor
@NoArgsConstructor
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "movie_id")
private long movieId;
@Column(name = "title")
private String title;
@ManyToMany
@JoinTable(
name = "movie_actor",
joinColumns = @JoinColumn(name = "movie_id"),
inverseJoinColumns = {@JoinColumn(name = "actor_id")}
)
@JsonManagedReference
private List<Actor> actors = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "CATEGORY_ID")
@JsonManagedReference
private Category category;
}
uj5u.com熱心網友回復:
所以你必須讓它在你的 API 中可以訪問。一種選擇是將交集表映射movie_actor到物體,然后將關系MovieActor拆分為和之間的關系,如下所示:ManyToManyActorMovieOneToManyMovieActor
@Entity
@Data
@Table(name = "movie_actor")
@AllArgsConstructor
@NoArgsConstructor
public class MovieActor {
@EmbeddedId
private MovieActorId productOrderId = new MovieActorId();
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@MapsId("movieId")
@JoinColumn(name = "product_id", nullable = false)
private Movie movie;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@MapsId("actorId")
@JoinColumn(name = "order_id", nullable = false)
private Actor actor;
public void addMovieActor(Movie aMovie, Actor aActor) {
movie = aMovie;
actor = aActor;
aMovie.getMovieActors().add(this);
aActor.getMovieActors().add(this);
}
}
@Embeddable
@Getter
@Setter
public class MovieActorId implements Serializable {
@Column(name = "movie_id")
private Long movieId;
@Column(name = "actor_id")
private Long actorId;
}
@Entity
@Data
@Table(name = "actor")
@AllArgsConstructor
@NoArgsConstructor
public class Actor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "actor_id")
private long actorId;
@OneToMany(mappedBy = "actor")
private List<MovieActor> movieActors = new ArrayList<>();
}
@Entity
@Data
@Table(name = "movie")
@AllArgsConstructor
@NoArgsConstructor
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "movie_id")
private long movieId;
@OneToMany(mappedBy = "movie")
private List<MovieActor> movieActors = new ArrayList<>();
}
現在您可以訪問查詢中的交集表MovieActor。如果需要,您甚至可以在此表中添加更多列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462564.html
