Estou fazendo alguns testes em meu ambiente. No primeiro teste criei uma classe Cliente com poucos atributos, persisti alguns cliente e até aí tudo bem. Fiz um pesquisa utilizando JPQL (select c from cliente c) e o SQL gerado foi completamente fácil de entender.
Agora...adicionei uma Classe Endereco e anotei na tabela Cliente um novo atributo private Endereco endereco e anotei com @OneToOne. Efetuei as alterações nas classes para que refletisse corretamente no banco de dados o novo campo com os id dos enderecos. Até aí tranquilo. Ao fazer a busca com JPQL, a query gerada funcionou e ficou da seguinte forma:
Hibernate: select cliente0_.id as id1_0_, cliente0_.endereco_id as endereco4_0_, cliente0_.idade as idade2_0_, cliente0_.nome as nome3_0_ from Cliente cliente0_
Hibernate: select endereco0_.id as id1_3_0_, endereco0_.bairro as bairro2_3_0_, endereco0_.cep as cep3_3_0_, endereco0_.logradouro as logradou4_3_0_ from Endereco endereco0_ where endereco0_.id=?
Hibernate: select endereco0_.id as id1_3_0_, endereco0_.bairro as bairro2_3_0_, endereco0_.cep as cep3_3_0_, endereco0_.logradouro as logradou4_3_0_ from Endereco endereco0_ where endereco0_.id=?
Hibernate: select endereco0_.id as id1_3_0_, endereco0_.bairro as bairro2_3_0_, endereco0_.cep as cep3_3_0_, endereco0_.logradouro as logradou4_3_0_ from Endereco endereco0_ where endereco0_.id=?
Hibernate: select endereco0_.id as id1_3_0_, endereco0_.bairro as bairro2_3_0_, endereco0_.cep as cep3_3_0_, endereco0_.logradouro as logradou4_3_0_ from Endereco endereco0_ where endereco0_.id=?
Pelo que entendi da consulta foi feito um select no Cliente e como o Endereço era relacionado, foi feito um select para cada endereço. Se houvesse 100 clientes, seriam 100 selects diferentes (a impressão que dá é o sistema visitando o banco de dados 100 vezes para trazer todos os resultados). Isso só pioraria se por exemplo esta mesma classe estivesse relacionando com outras classes (viraria o caos ao meu entender). Minha linha de raciocínio esta correta do funcionamento do JPQL utilizando (select c from cliente c) por detrás das câmeras? Ou poderíamos otimizar esta busca para que ao invés de 100 vezes ir buscar os dados em uma única busca trazer todos os resultados?