简体   繁体   中英

Querying in One to many mappings in hibernate

Let's say I have a book entity and a library entity (one library can have multiple books, but each book belongs to only one library). They are defined as follows:

public class Library
{
    @Id
    private Long id;

    @OneToMany(mappedBy = "library")
    private List<Book> books = new ArrayList<>();
}

and

public class Book
{
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="FK_Library", nullable=false)
    private Library library;
}

I want to find all books which belong to a particular library. One way is to create a LibraryRepository as follows:

public interface LibraryRepository extends JpaRepository<Library, Long>{}

Now I have findById(Long libraryId) method that returns a Library object with a List<Book> in it.

I was wondering if it is possible to create a BookRepository and declare a method named findByLibraryId(Long libraryId) and let hibernate query the Book table by the foreign key FK_Library , without performing any joins .

Something like this:

public interface BookRepository extends JpaRepository<Book, Long> {
    public List<Book> findByLibraryId(Long libraryId);
}

The above method findByLibraryId does perform join. I do not want it to perform a join, since all I want is find all rows which have library_id defined by foreign key relationship.

Also is the first method more preferable then second one?

You can use @Query with JPQL to do that

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

You could change the @ManyToOne relationship to lazy loading.

@ManyToOne(fetch = FetchType.LAZY)

This is the default for OneToMany, thats why you see no join when you search the Library.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM