我正在将 Spring-Boot 与 JPA 和 MySQL 后端结合使用。现在我对 Spring-Boot 提供的存储库感到非常困惑。我知道它们非常强大(并且似乎非常有用,因为它们可以大大缩短您的代码)。不过,我不明白如何在其中表示联接,因为结果集应该是选择几个实体中指定属性的组合。
现在假设我们有三个表 Book
、Author
、AuthorOfBook
,其中最后一个表只是连接 Book
code> 和 Author
通过组合主键。我猜我们有以下 Java 类:
实体书:
@Entity
@Table(name="BOOK")
public class Book {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@Column(name = "TITLE")
private String title;
}
实体作者
@Entity
@Table(name="AUTHOR")
public class Author {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@Column(name = "LASTNAME")
private String lastname;
@Column(name = "FIRSTNAME")
private String firstname;
//Let's assume some getters and setters and a constructor
}
实体AuthorOfBook:
@Entity
@Table(name="BOOK")
public class Book {
@EmbeddedId
private AuthorOfBookId pk;
}
嵌入式 ID
@Embeddable
public class AuthorOfBookId implements Serializable {
private int authorId;
private int bookId;
}
存储库
@Repository
public interface AuthorOfBookRepository extends JpaRepository<,AuthorOfBookId> {
}
现在我将如何表示该查询:
SELECT b.name, a.firstname, a.lastname from AuthorOfBook ab inner join Book b on b.id = ab.book_id inner join Author a on a.id = ab.author_id where a.lastname = :lastname;
在我的存储库中?我知道签名需要像
@Query([the query string from above])
public (...) findAuthorAndBookByAuthorLastname(@Param("lastname") String lastname);
但我无法确定返回的 Type 会是什么样子。该方法返回什么? (我猜 AuthorOfBook
根本不起作用)
最佳答案
您不希望 AuthorOfBook
作为单独的实体。 Book
应该有一个 Author
类型的字段作为 @ManyToOne 关系。这样,对于任何Book
,您都可以找到作者的详细信息。
关于java - 如何在 Spring JPA Repository 方法中使用 @Query 注释来描述连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53732978/