我们正在使用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"), ...
此策略有助于减少查询次数,
有没有办法在WHERE子句中获得使用IN的单个查询的策略?
提前致谢。 戴夫
答案 0 :(得分:1)
在内部,QueryHint“eclipselink.batch”被转换为addBatchAttribute(),因此您看到的行为应该相同。您创建的JPQL是否生成与本机TopLink API相同的查询?您可以在JPQL中使用Fetch或其他连接吗?
答案 1 :(得分:1)
EclipseLink支持多种类型的批量提取。
请参阅, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html