5

我有以下三个实体:

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
}

现在,给定一个EntityA的实例,我想得到一个EntityC的列表。我目前有两种选择。不知道哪个更优化。选项包括:

1.
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya)

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

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

4

2 回答 2

3

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

对于#1中的查询,您的查询使用子选择不是很有效,只需使用连接,

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

于 2012-07-12T14:43:34.427 回答
2

我认为所有解释为 SQL 查询的查询,这些只是不同的样式,你不必考虑它。所有查询都将解释为 theta 样式。我不认为,有性能差异,这只是个人选择。这是一篇关于 SQL 查询样式MySQL 连接的非常新鲜的文章:ON vs. USING vs. Theta-style,我希望这个链接对您有所帮助。

于 2012-07-12T10:37:21.313 回答