java - 如何优化 JPA 查询

标签 java jpa persistence 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
}

现在,给定一个 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

这两个查询中哪个更简单和优化?

最佳答案

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

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

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

关于java - 如何优化 JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11447180/

相关文章:

java - 无需 Adob​​e 插件即可在 Web 中阅读 PDF 文件

hibernate - 如何使用实体查询框架对以下查询进行建模

java - 在 OneToMany 关系中保存时,JPA 不清除 Set 迭代器

java - @ElementCollection Java持久化(Hibernate)导致加载重复实例

java - 将重定向从服务器发送到 Angular

java - 错误 : Failed to resolve: com. google.girebase :firebase-core:16. 2.0

java - 如何获取远程主solr服务器已删除但仍存在于本地solr服务器中的已删除文档

java - 提交期间的延迟(使用 JPA/JTA)

io - Redis:请只保留不会过期的键?

ios - 读取和写入 plist(iPhone 编程)