Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中查询一对多映射_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 在hibernate中查询一对多映射

Java 在hibernate中查询一对多映射,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,假设我有一个图书实体和一个图书馆实体(一个图书馆可以有多本书,但每本书只属于一个图书馆)。它们的定义如下: public class Library { @Id private Long id; @OneToMany(mappedBy = "library") private List<Book> books = new ArrayList<>(); } public interface LibraryReposit

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

public class Library
{
    @Id
    private Long id;

    @OneToMany(mappedBy = "library")
    private List<Book> books = new ArrayList<>();
}
public interface LibraryRepository extends JpaRepository<Library, Long>{}
我想找到属于某个图书馆的所有书。一种方法是创建一个
LibraryRepository
,如下所示:

public class Library
{
    @Id
    private Long id;

    @OneToMany(mappedBy = "library")
    private List<Book> books = new ArrayList<>();
}
public interface LibraryRepository extends JpaRepository<Library, Long>{}
上面的方法
findByLibraryId
执行连接。我不想让它执行联接,因为我只想找到所有具有由外键关系定义的
library\u id
的行


第一种方法比第二种方法更可取吗?

您可以将
@Query
与JPQL结合使用来实现这一点

@Query("SELECT b FROM Book b WHERE b.library.id = :libraryId")
public List<Book> findByLibraryId(Long libraryId);
@Query(“从书b中选择b,其中b.library.id=:libraryId”)
公共列表findByLibraryId(长库id);

您可以将@manytone关系更改为延迟加载

@ManyToOne(fetch = FetchType.LAZY)

这是OneToMany的默认设置,这就是为什么在搜索库时看不到连接。

为什么需要这个?您可以使用本机查询完成此操作,也可以使用JPQL。使用本机查询可能会将其绑定到特定类型的架构。此外,在
LibraryRepository
findById
方法中,它返回
Library
对象和
List
,但当我看到hibernate生成的查询时,它不会执行联接。这怎么可能呢?@OneToMany默认情况下是懒惰的,所以当调用getter时,首先获取库,然后在separte查询中获取库中的书籍。所以执行了2个查询。从性能方面看,使用
@Query
更好,或者使用LibraryRepository的
findById
方法?取决于您是否只需要图书馆的书籍,然后使用@Query,如果您还需要图书馆,则在
LibraryRepository
中进行查询,而不是使用@EntityGraph进行两次查询,而是使用一次查询