JPA相当于Oracle TopLink的addBatchReadAttribute

时间:2011-09-27 19:35:34

标签: jpa batch-file toplink

我们正在使用JPA,当一个对象集合从查询返回时,将对通过外键关联的每个“子”对象执行单独的查询。

例如,在我们的Authorization实体类中,我们映射了以下Client对象:

@JoinColumn(name = "clientId", referencedColumnName = "clientId")
@ManyToOne (fetch = FetchType.LAZY)
@NotNull(groups = Default.class)
private Client client;

当返回10个授权时,将执行10个客户端查询。在TopLink中,我能够使用ReadAllQuery类的addBatchReadAttribute()方法将此数字设置为1。根据TopLink文档,“当访问任何批处理部件时,所有部件都将在单个查询中读取,这允许在单个查询中读取部件所需的所有数据,而不是(n)个查询。“

这非常有效,使用带有10个ID的IN子句为我们提供单个查询。

我读到的关于re:JPA指向了批处理连接或类似的东西:

hints = {@QueryHint(name = "eclipselink.batch", value = "p.client"), ... 

此策略有助于减少查询次数,

  • 但它也给了我更多的联接,可能会减慢(?)的速度 一些查询
  • 并且它似乎没有像TopLink电话那样大幅提供帮助。

有没有办法在WHERE子句中获得使用IN的单个查询的策略?

提前致谢。 戴夫

2 个答案:

答案 0 :(得分:1)

在内部,QueryHint“eclipselink.batch”被转换为addBatchAttribute(),因此您看到的行为应该相同。您创建的JPQL是否生成与本机TopLink API相同的查询?您可以在JPQL中使用Fetch或其他连接吗?

答案 1 :(得分:1)