gpt4 book ai didi

java - 使用 7 个连接、JPA 还是 SQL 进行高效查询?什么类型的 Collection ?

转载 作者:行者123 更新时间:2023-11-29 12:09:49 25 4
gpt4 key购买 nike

各位!

必须对具有 7 个连接的昂贵 JPA 查询进行性能调整,在本地完成需要 42 秒,在远程服务器 (AWS) 中需要约 3 分钟。

SELECT res FROM Resultado res JOIN res.panoramica pan JOIN pan.gondolaId gon JOIN gon.visitaId vis JOIN vis.estabelecimentoId estab JOIN estab.cliente cli JOIN res.configuracaoAnalise ca JOIN vis.usuarioId usu

将其修改为完整的 native SQL 查询(选择与联接中每个表关联的所有字段),时间减少到不到一毫秒。当使用这种方法时,我失去了 JPA 的易用性,因为方法 fullQuery返回List<Object[]> ,但性能确实是最重要的。

将值(由 fullQuery 返回)分配给托管 bean 中的 List 时,需要 10 秒,并且该列表现在有 20 万个元素。

在这种情况下最推荐的选项是什么?

已解决:

感谢 @dcsohl 的回答,它适用于以下内容:

@SqlResultSetMapping(
name="ResultadoJoin"
,entities={
@EntityResult(entityClass=Resultado.class)
,@EntityResult(entityClass=Panoramica.class)
,@EntityResult(entityClass=ConfiguracaoAnalise.class)
,@EntityResult(entityClass=Gondola.class)
,@EntityResult(entityClass=Visita.class)
,@EntityResult(entityClass=Estabelecimento.class)
,@EntityResult(entityClass=Usuario.class)
,@EntityResult(entityClass=Equipe.class)
}
)

最佳答案

你说原生 SQL 查询的运行时间不到一毫秒。所以坚持下去。但这并不意味着您必须处理来自 query.getResultList() 的列表。

您可以执行 native 查询(从 EntityManager.createNativeQuery() 或从 EntityManager.createNamedQuery() 引用 @NamedNativeQuery ),并且仍然让 JPA 为您构建对象。

指定@SqlResultSetMapping指定您希望使用哪些 @Entity 类,它们将根据查询结果为您创建。我不知道你的模式或实体,所以恐怕目前我无法走得更远。如果您的 @Entity 类配置正确并且结果集中没有重复的列名称,那么它可以简单到

@SqlResultSetMapping(name = "MyNativeQuery",
entities = {
@EntityResult(entityClass = Entity1.class),
@EntityResult(entityClass = Entity2.class),
@EntityResult(entityClass = Entity3.class),
@EntityResult(entityClass = Entity4.class),
@EntityResult(entityClass = Entity5.class),
@EntityResult(entityClass = Entity6.class),
@EntityResult(entityClass = Entity7.class)
}
)

但您可能需要将 fields 参数包含到 @EntityResult 中,提供 @FieldResult 项的列表,以使一切正确.

关于java - 使用 7 个连接、JPA 还是 SQL 进行高效查询?什么类型的 Collection ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com