java - 在 hibernate 中查询一对多映射

标签 java hibernate jpa spring-data-jpa

假设我有一个图书实体和一个图书馆实体(一个图书馆可以有多本书,但每本书只属于一个图书馆)。它们的定义如下:

public class Library
{
    @Id
    private Long id;

    @OneToMany(mappedBy = "library")
    private List<Book> books = new ArrayList<>();
}
public class Book
{
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="FK_Library", nullable=false)
    private Library library;
}
我想找到属于特定图书馆的所有书籍。一种方法是创建一个 LibraryRepository如下:
public interface LibraryRepository extends JpaRepository<Library, Long>{}
现在我有 findById(Long libraryId)返回 Library 的方法带有 List<Book> 的对象在里面。
我想知道是否可以创建一个 BookRepository并声明一个名为 findByLibraryId(Long libraryId) 的方法并让 hibernate 查询 Book外键表FK_Library , 不执行任何连接 .
像这样的东西:
public interface BookRepository extends JpaRepository<Book, Long> {
    public List<Book> findByLibraryId(Long libraryId);
}
以上方法findByLibraryId确实执行加入。我不希望它执行连接,因为我想要的只是找到所有具有 library_id 的行由外键关系定义。
第一种方法比第二种方法更可取吗?

最佳答案

您可以使用 @Query使用 JPQL 来做到这一点

@Query("SELECT b FROM Book b WHERE b.library.id = :libraryId")
public List<Book> findByLibraryId(Long libraryId);

关于java - 在 hibernate 中查询一对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338868/

相关文章:

java - 如何为用户定义的输入提供转义序列

java - 如何在调用代码输入和基于计时器的输入之间切换并使用响应式(Reactive)编程对其进行单元测试

java - 如何在java中使用正则表达式验证字符串

java - 多个应用程序中的内存泄漏

java - 批量插入/替换中别名路径的不匹配大括号

java - 使用 JPA 的 Web 应用程序无法在外部 Tomcat 服务器上运行

java - EclipseLink MongoDB 连接

java - 如何在Seam应用程序中访问*.properties文件

java - 在 Hibernate 中处理环境特定字段的最佳方法

java - JPA hibernate : generation type sequence always inserts 0 into column