伙计们!
必须使用7 joins对昂贵的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
将其修改为一个完整的原生SQL查询(选择与联接中的每个表关联的所有字段),时间缩短到不到一毫秒。在使用这种方法时,我失去了JPA的易用性,因为fullQuery方法返回List<Object[]>,但是性能确实是最重要的。
当将值(由fullQuery返回)分配给托管bean中的列表时,需要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)
}
)发布于 2015-06-17 15:23:09
您可以说本机SQL查询在不到毫秒的时间内运行。那就坚持下去吧。但这并不意味着你必须与来自query.getResultList()的列表做斗争。
您可以执行本机查询(无论是从EntityManager.createNativeQuery()还是从EntityManager.createNamedQuery()执行,并且仍然让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项的列表,以使一切正常。
https://stackoverflow.com/questions/30893362
复制相似问题