mysql - 春季 JPA | 在多对多关系中搜索
问题描述
我有 2 个表Book
,并且Author
在多对多关系中使用一个候选键表author_book
,该表具有author
和的主键Book
。
我正在尝试从给定作者那里获取所有书籍AUTHOR_ID
,也许在它有效之后我会尝试按名称搜索
create table author_book(
`AUTHOR_ID` INT,
`BOOK_ID` INT
);
`
create table author(
`AUTHOR_ID` int auto_increment,
`FIRST_NAME` varchar(255),
`LAST_NAME` varchar(255),
`EMAIL` varchar(30),
`CONTACT_NO` VARCHAR(10),
primary key(AUTHOR_ID)
);
create table book(
`BOOK_ID` int auto_increment,
`TITLE` varchar(255),
`SUBJECT` varchar(255),
`PUBLISHED_YEAR` int,
`ISBN` varchar(30),
`QUANTITY` int,
`SHELF_DETAILS` varchar(255),
`PUBLISHER_ID` int,
`BOOK_COST` INT,
primary key(BOOK_ID)
);
我决定AUTHOR_NAME
使用CONCAT
我尝试使用此查询按 author_id 进行搜索
@Query("select b from Books b where b.bookId in (select a.bookId from author_book a where a.author_id = :Id)")
但是我收到了author_book
未映射的错误,所以我需要为这个类创建另一个实体来执行这两个类的任何操作吗?我也不确定嵌套查询是否适用于 JPQL,这基本上是一种预感。
我的Books
实体
@Entity
@Table(name = "book")
public class Books implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="BOOK_ID")
private int bookId;
@Column(name="TITLE")
private String title;
@Column(name="SUBJECT")
private String subject;
@Column(name="PUBLISHED_YEAR")
private int publishedYear;
@Column(name="ISBN")
private String isbn;
@Column(name="QUANTITY")
private int quantity;
@Column(name="SHELF_DETAILS")
private String shelfDetails;
@Column(name="BOOK_COST")
private int bookCost;
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "author_book",
joinColumns = { @JoinColumn(name = "BOOK_ID") },
inverseJoinColumns = { @JoinColumn(name = "AUTHOR_ID") })
private Set<Authors> authors = new HashSet<Authors>();
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PUBLISHER_ID")
private Publishers publisher;
// getters and setters
}
我的Authors
实体
@Entity
@Table(name="author")
public class Authors {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="AUTHOR_ID")
private int authorId;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@Column(name="EMAIL")
private String email;
@Column(name="CONTACT_NO")
private String contactNo;
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "authors")
private Set<Books> books = new HashSet<Books>();
// Getters and setters
}
解决方案
您应该在 Authors Entity 中添加 mappedBy 东西。
@ManyToMany(mappedBy="authors", fetch=FetchType.LAZY)
private Set<Books> books = new HashSet<Books>();
推荐阅读
- javascript - 如何调用带有淘汰赛的javascript方法
- scala - 在大型 RDD 上使用 spark 计数会产生内存错误
- javascript - 从外部 js 文件调用嵌套函数
- python - 无法从文档 DB AWS 将 pymongo 连接到 mongodb 集群
- python - 语法验证实用程序
- r - 在访问选项卡之前,另一个选项卡中的传单未使用传单代理更新
- python - 如何从熊猫数据框创建多关系边缘列表?
- c++ - 我如何制作一个函数来检查一个单词在向量中是否重复超过两次或更多次,并输出它重复的次数?在 C++ 中
- python - 使用 sklearn 的决策树分类器 100% 准确率
- javascript - 反应原生钩子中的这种拉动刷新功能的等价物是什么?