JavaLearner
JavaLearner

Reputation: 637

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?

Upvotes: 4

Views: 1641

Answers (2)

Turo
Turo

Reputation: 4914

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.

Upvotes: 2

Eklavya
Eklavya

Reputation: 18410

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);

Upvotes: 3

Related Questions