我正在使用hibernate并使用连接查询遇到一些问题,由于某种原因它会生成所有的查询。表结构非常标准如下:
-----------------------------------
| invoice_product |
-----------------------------------
| invpro_inv_id int |
| invpro_pro_id int |
-----------------------------------
-----------------------------------
| invoice |
-----------------------------------
| inv_id int |
| ....etc... |
-----------------------------------
-----------------------------------
| product |
-----------------------------------
| pro_id int |
| ....etc... |
-----------------------------------
抓取对象并将其映射到我的域模型的代码:
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("select f from " + Invoice.class.getName() + " f");
List<Factuur> factuurList = query.list();
session.flush();
这里是实体中的相关代码:
public class Invoice {
--- omitted -------
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany
@JoinTable(
name = "invoice_product",
joinColumns = @JoinColumn(name = "invpro_inv_id", referencedColumnName = "inv_id"),
inverseJoinColumns = @JoinColumn(name = "invpro_pro_id", referencedColumnName = "pro_id")
)
private Set<Product> productSet;
------- omitted ----------
}
正如你所看到的,我让hibernate几乎可以处理所有事情。我没有创建一些自定义SQL查询。
由于某种原因,这会向数据库生成所有查询。它创建了1个查询以按预期获取发票,然后当它转到连接表位时,它会生成大约300个选择查询以获取发票的所有产品。我认为这通常需要每个发票2个查询(1选择发票,2创建联接以获取产品)。
所以我的问题是为什么hibernate会创建这么多查询。 hibernate如何解释这个?而且,这是解决这个问题的唯一方法吗?
提前致谢
修改:已解决。对于那些想知道的人,添加@Fetch(FetchMode.SUBSELECT)注释可以解决问题。这只是我没有正确阅读文档的情况!