我从网上和论坛上阅读了有关BatchSize的相关主题,但我仍然不了解某些部分。所以我们来描述我理解的和不理解的东西。
批量提取:选择提取的优化策略。 Hibernate在一个中检索一批实体实例或集合 单个SELECT,通过指定主键或外键列表。
让我们拥有JPA 2.0,并实现Hibernate。这些实体:
@Entity
public class Product{
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@BatchSize(size = 50)
private Manufacturer manufacturer;
...
}
@Entity
public class Manufacturer {
@Id
private long id;
private String name;
...
}
所以我在产品中的制造商上进行了Lazy抓取。所以当我执行select选取时就完成了。所以我有 One-Many< =>制造商 - 产品关系。我想找到所有名称中包含“oak”的制造商。我写道:
SELECT * FROM product as p
join manufacturer as m on p.id=m.id
where m.name like '%oak%'
所以我不明白batchsize如何帮助我。 Hibernate会生成100个选择还是只生成一个(我写的)?或2-to选择TOP 50项目?
答案 0 :(得分:2)
首先。您的@BatchSize注释必须放在Manufacturer-Entity上。此注释只能放在Collection-fields上。假设你纠正了......
如果你采用这个jpql查询
SELECT p FROM product as p where p.manufacturer.name like :name
hibernate将对产品执行1次选择,一旦您访问第一个制造商,它将为多达50个不同的制造商进行选择。
select ... from manufacturere where ID in (?, ?, ?, ?, ...)
如果您的结果有超过50个不同的制造商并且您对其进行迭代,那么只要您尝试访问未在先前批次选择中重新获得的制造商,就会执行具有此类in子句的下一个查询。