@BatchSize How works in Hibernate 深度解析?
How @BatchSize works in Hibernate deep explanation?
我在网上和论坛上看了关于BatchSize的相关话题,但还是有些不明白。那么让我们描述一下我理解的和不理解的。
Batch fetching: an optimization strategy for select fetching.
Hibernate retrieves a batch of entity instances or collections in a
single SELECT by specifying a list of primary or foreign keys.
让我们拥有 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;
...
}
所以我在产品中延迟获取制造商。所以当我执行 select 时,抓取就完成了。所以我有 One-Many <=>Manufacturer - Product relation。我想找到名称包含 "oak" 的所有制造商。所以我写:
SELECT * FROM product as p
join manufacturer as m on p.id=m.id
where m.name like '%oak%'
所以我不明白 batchsize 对我有什么帮助。 Hibernate 会生成 100 selects 还是只生成一个(我写的)?或 2-to 其中包含 select 个 TOP 50 项目?
首先。您的 @BatchSize 注释必须放在 Manufacturer-Entity 上。此注解只能放在 Collection-fields 上。假设您更正了...
如果你采用这个 jpql 查询
SELECT p FROM product as p where p.manufacturer.name like :name
hibernate 将为产品执行 1 select,一旦您访问第一个制造商,它就会为多达 50 个不同的制造商执行 select。
select ... from manufacturere where ID in (?, ?, ?, ?, ...)
如果您的结果有超过 50 个不同的制造商,并且您对其进行迭代,那么只要您尝试访问在前一批中未检索到的制造商,就会立即执行带有此类 in 子句的下一个查询-select。
我在网上和论坛上看了关于BatchSize的相关话题,但还是有些不明白。那么让我们描述一下我理解的和不理解的。
Batch fetching: an optimization strategy for select fetching. Hibernate retrieves a batch of entity instances or collections in a single SELECT by specifying a list of primary or foreign keys.
让我们拥有 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;
...
}
所以我在产品中延迟获取制造商。所以当我执行 select 时,抓取就完成了。所以我有 One-Many <=>Manufacturer - Product relation。我想找到名称包含 "oak" 的所有制造商。所以我写:
SELECT * FROM product as p
join manufacturer as m on p.id=m.id
where m.name like '%oak%'
所以我不明白 batchsize 对我有什么帮助。 Hibernate 会生成 100 selects 还是只生成一个(我写的)?或 2-to 其中包含 select 个 TOP 50 项目?
首先。您的 @BatchSize 注释必须放在 Manufacturer-Entity 上。此注解只能放在 Collection-fields 上。假设您更正了...
如果你采用这个 jpql 查询
SELECT p FROM product as p where p.manufacturer.name like :name
hibernate 将为产品执行 1 select,一旦您访问第一个制造商,它就会为多达 50 个不同的制造商执行 select。
select ... from manufacturere where ID in (?, ?, ?, ?, ...)
如果您的结果有超过 50 个不同的制造商,并且您对其进行迭代,那么只要您尝试访问在前一批中未检索到的制造商,就会立即执行带有此类 in 子句的下一个查询-select。