Ola,
Eu tenho uma tabela com 30 mil registros, quero gerar um arquivo de exportacao de dados em txt. Ao inves do Hibernate fazer SELECT * FROM produto, ele esta fazendo SELECT * FROM PRODUTO WHERE ID=?, isso 30 mil vezes. Tem como resolver isso? Ou vou ter que usar SQL nativo ou JDBC?
public interface ProdutoEmpresaRepository extends JpaRepository<ProdutoEmpresa, Integer> {
@Query("select pe from ProdutoEmpresa pe where pe.empresa=?1 and pe.produto.bloqueiaVenda=false and pe.produto.excluido=false")
public List<ProdutoEmpresa> findByProdutoAtivo(Empresa empresa);
}
Pois leva 15 minutos num processo que deveria levar 1 minuto no maximo.
Estou usando Spring Data-JPA com hibernate.
nao eh o where empresa id que esta dando o problema. pois antes de fazer o post, testei com o metodo findAll(), do JpaRepository, e o comportamento é o mesmo, um select para cara linha da tabela. Verifiquei o metodo que gera a carga da balanca toledo, ele tambem da um select para cada produto da tabela.
Reescrevi aqui um bem basico para fazer simulacoes sem praticamente configuracao nenhuma. mas ocorre a mesma coisa. Vou postar as entidades desse que reescrevi. Enquanto nao tinha relacionamentos funcionou perfeito nao dava nem 1 segundo. Coloquei os relacionamento comecou a fazer um select para cada linha da tabela produto.
` @Entity
public class Produto implements Serializable {
Achei a solucao no livro de Gilliard Cordeiro, Aplicacoes para web com jsf e jpa.
O problema era devido ao relacionamento, primeiro dava um select * from produtoempresa, depois dava um select para recuperar o produto. Alterei a jpql para
Query q = sessao.createQuery("select p from ProdutoEmpresa p join fetch p.produto join fetch p.empresa");
agora o select executando da um select * from produtoempresa inner join produto inner join empresa e a execucao leva 7 segundos.