1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Acabar com N+1 queries usando Lazy EXTRA

Bom dia galera, em uma entidade minha eu uso @LazyCollection(LazyCollectionOption.EXTRA), porém está gerando N+1 queries. Eu tentei colocar LEFT JOIN FETCH na minha query, mas dessa forma ele carrega o objeto inteiro do relacionamento, e em alguns casos eu uso somente o objeto.size() então não me convém em alguns casos eu carregar o objeto inteiro do relacionamento. Atualmente está assim:

    @OneToMany(mappedBy = "end_id", cascade = CascadeType.ALL, orphanRemoval = true)
    @LazyCollection(LazyCollectionOption.EXTRA)
    private List<EnderecoProduto> enderecoProduto;

E quando listo um datatable com o .size() ele gera:

INFO: Hibernate: select endereco0_.end_id as end1_2_, endereco0_.end_apartamento as end2_2_, endereco0_.end_indicador as end3_2_, endereco0_.end_modulo as end4_2_, endereco0_.end_pesomaximo as end5_2_, endereco0_.end_rua as end6_2_ from endereco endereco0_ order by endereco0_.end_rua ASC limit ?
INFO: Hibernate: select count(endpro_id) from endereco_produto where end_id =?
INFO: Hibernate: select count(endpro_id) from endereco_produto where end_id =?
INFO: Hibernate: select count(endpro_id) from endereco_produto where end_id =?
INFO: Hibernate: select count(endpro_id) from endereco_produto where end_id =?
INFO: Hibernate: select count(endpro_id) from endereco_produto where end_id =?

Teria como eu incluir o count com FETCH no meu HQL?

Agradeço desde já! Abraço!

  • Usa Criteria e seja feliz, aplicando fetch.

    javaflex   08 de jul de 2013
  • Não seria uma boa pois estou usando p:datatable com Lazy loading, e eu nem imagino como adaptar uma criteria nele. Obrigado pela resposta

    Rafael   10 de jul de 2013
  • JSF complica mesmo. O ideal é a view já receber os dados sem ligação com hibernate.

    javaflex   10 de jul de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate lazy ou faça a sua própria pergunta.