如何优化JPA查询

Uch*_*nwu 5 java persistence jpa jpa-2.0

我有三个实体如下:

public class EntityA
{
    private Long id;
    //Getters and setters
}

public class EntityB
{
    private Long id;
    private EntityA entitya;
    //Getters and setters
}

public class EntityC
{
    private Long id;
    private BigDecimal amount;
    private EntityB entityb;
    //Getters and setters
}
Run Code Online (Sandbox Code Playgroud)

现在,给定一个Entity of EntityA,我想得到一个EntityC列表.我目前有两种选择.我不知道哪一个更优化.选项是:

1.
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya)
Run Code Online (Sandbox Code Playgroud)

2.向EntityB添加新属性

private Set<EntityC> entityCCol;

@OneToMany(mappedBy="entityb")
public Set<EntityC> getEntityCCol()
{
   return entityCCol;
}

select b from EntityB a join fetch a.entityCCol b
Run Code Online (Sandbox Code Playgroud)

这两个查询中的哪一个更容易和优化?

Jam*_*mes 3

这取决于集合的大小。对于小型集合,我将使用对象模型中的关系。更多地从设计/可用性的角度而不是性能的角度来看,它更加面向对象。我不会加入获取它,只是正常访问模型。您可能还应该建立从 A 到 B 的关系,以使您的模型更有用。

对于#1中的查询,使用子选择的查询效率不是很高,只需使用联接,

从 EntityC c 中选择 c,其中 c.entityb.entitya = :entitya