英文:
Querying in One to many mappings in hibernate
问题
以下是您要翻译的部分:
我有一个书籍实体和一个图书馆实体(一个图书馆可以有多本书,但每本书只属于一个图书馆)。它们的定义如下:
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)`方法,它返回一个包含`List<Book>`的`Library`对象。
我想知道是否可能创建一个`BookRepository`,并声明一个名为`findByLibraryId(Long libraryId)`的方法,并让Hibernate通过外键`FK_Library`查询`Book`表,**而不执行任何连接操作**。
像这样:
public interface BookRepository extends JpaRepository<Book, Long> {
public List<Book> findByLibraryId(Long libraryId);
}
上述方法`findByLibraryId`确实执行连接操作。我不希望它执行连接操作,因为我只想查找由外键关系定义的所有具有`library_id`的行。
另外,第一种方法是否比第二种方法更可取?
英文:
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?
答案1
得分: 3
你可以使用JPQL的@Query
来实现这个功能。
@Query("SELECT b FROM Book b WHERE b.library.id = :libraryId")
public List<Book> findByLibraryId(Long libraryId);
英文:
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);
答案2
得分: 2
你可以将@ManyToOne关系更改为懒加载。
@ManyToOne(fetch = FetchType.LAZY)
这是OneToMany的默认设置,这就是为什么在搜索Library时你看不到连接的原因。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论