【发布时间】:2021-08-15 05:04:50
【问题描述】:
我正在努力强制 Hibernate 在获取数据时使用两个表之间的连接。我们有一个大的父表和一个大的子表,由多个列连接(没有单一的 ID 列)。当我们获取父记录时,Hibernate 急切地获取子记录,但它使用单独的查询来完成,每个父记录一个。与只有一个包含连接的查询相比,这似乎非常慢。
但是如何让 Hibernate 进行连接呢?
以下是实体(这只是一个匿名示例):
@Entity
@Table(name = "BOOKS")
public class Book
{
@EmbeddedId
private BookID id;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "PUBLISH_DATE")
private Date publishDate;
@OneToMany(mappedBy = "book", fetch = EAGER, cascade = ALL, orphanRemoval = true)
private List<BookReview> reviews;
}
@Entity
@Table(name = "BOOK_REVIEWS")
public class BookReview
{
@EmbeddedId
private BookReviewID id;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "TITLE", referencedColumnName = "TITLE"),
@JoinColumn(name = "AUTHOR_FIRST_NAME", referencedColumnName = "AUTHOR_FIRST_NAME"),
@JoinColumn(name = "AUTHOR_LAST_NAME", referencedColumnName = "AUTHOR_LAST_NAME")
})
private Book book;
@Column(name = "UPDATE_DATE")
private Date updateDate;
}
...及其嵌入的键:
@Embeddable
public class BookID
{
@Column(name = "TITLE")
private String title;
@Column(name = "AUTHOR_FIRST_NAME")
private String authorFirstName;
@Column(name = "AUTHOR_LAST_NAME")
private String authorLastName;
}
@Embeddable
public class BookReviewID extends BookID
{
@Column(name = "USERNAME")
private String userName;
}
当我对 BOOK 中的所有记录(使用 entityManager.createQuery("from Book"))运行查询时,它会在 BOOK 表上运行一个查询以获取所有记录,然后单独查询每个记录的评论时间>。与其对每本书的每组评论进行单独查询,不如一开始就通过left outer join 来获取它们似乎会更有效。
这甚至可以通过注释实现吗?还是我必须使用CriteriaBuilder 或查询语言?
我应该注意,添加 @Fetch(FetchMode.JOIN) 并不会改变它在幕后所做的任何事情。
【问题讨论】:
-
这样的情况可能需要native sql query。
标签: java hibernate jpa annotations