【问题标题】:How to Optimise a JPA Query如何优化 JPA 查询
【发布时间】:2012-07-11 22:17:06
【问题描述】:

我有如下三个实体:

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

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

【问题讨论】:

  • select c from EntityC c where c.entityB.entityA = :a 怎么样?如果您创建此查询,create index IX_B_A on entityB(entityA, id) 生成的查询将足够快。

标签: java jpa persistence jpa-2.0


【解决方案1】:

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

【讨论】:

  • 我对上述两个查询和任何其他建议的查询的关注是性能。猜猜看,在数据库 EntityB 中有大约 20,000 条记录,而 20,000 条记录中的每条记录至少有 200 条记录,即 EntityC。
【解决方案2】:

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

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

select c from EntityC c where c.entityb.entitya = :entitya

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 2012-05-18
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多