Reputation: 637
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
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
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