Quero executar uma query que me retorne LineItems filtrando pelo codigo_cliente do objeto Order. Em SQL (Oracle) eu faria assim :
SELECT * FROM LINEITEM ITE ORDER OS WHERE ITE.NUMOS = OS.NUMOS AND OS.CLIENTE = ?
// Join entre aluno e carro
// isto retorna uma Lista de Object[2]
Listlist=session.find("select p.nome,v.nome from PessoaVO as p inner join p.veiculos as v");
// vc pode criar um VO só para receber estes campos…
// para fazer deste jeito tem que ter um construtor no VO
// então isto retorna uma Lista de PessoaVeiculoVO
Listlist=session.find("select new hibernate.PessoaVeiculoVO(p.nome,v.nome) from PessoaVO as p inner join p.veiculos as v");
Agora entendi. fiz um teste aqui e funcionou legal.
A única coisa que achei estranho ao analizar o SQL que o Hibernate gera é o seguinte :
Fiz uma Query partindo do “Veiculo”, e como na PK do Veiculo tem uma referencia à Pessoa ele executa o SELECT no Veiculo ,e ao processar o ResultSet ele executa outra SELECT na Pessoa para cada linha do ResultSet do Veiculo para carregar a tal referencia da PK.
Portanto se a SELECT do Veiculo retornar 10 linhas, ele vai no banco 10 vezes para trazer a Pessoa de cada Veiculo. Verifiquei também que se tiver alguma Pessoa com mais de um Veiculo ele vai no banco soh uma vez ( menos ruim ).
Será que consigo otimizar este tipo de coisa ?
ricardolecheta
esta também está sendo a minha preocupação…
mas quando vc definie um relacionamento tem a opção lazy=true para ele não trazer os relacionamentos automaticamente, isto é só buscaria veiculo ao fazer pessoa.getVeiculos()
tb estou com bastante dúvidas neste ponto do Hibernate.
C
CLAUDIO_GUALBERTO
O jeito então é quebrar cabeça para melhorar isso.
Vc sabe se existe alguma forma de simular o esquema de cache dos Entity Beans com commit-type A, ou seja , carrego uma referencia somente uma vez em todo o ciclo de vida da aplicação.
Isto é muito utilizado com tabelas (quase) nunca atualizadas, como cadastro de cidades, estados e similares.
Estou perguntando isso pois pelo que parece o ciclo de vida de uma referencia no Hibernate é o mesmo da Session, ou seja , uma transação. Isso é verdade ou entendi errado ?
ricardolecheta
você está certo. O correto é abrir apenas uma Session do Hibernate por transação…
se vc fizer o "load"de uma tabela e logo depois tentar fazer outro “load”,
o Hibernate lança seguinte erro:
“attempted to load into an instance that was already associated with the Session”
isto significa que vc somente pode carregar uma instancia de uma classe por Session do Hibernate, isto é por transação…
C
CLAUDIO_GUALBERTO
Entaum a única forma de se simular o COMMIT TYPE A dos EntityBeans e fazendo este controle na mão mesmo, pois eu poderia ter uma cache em um Singleton que seria populada somente uma vez ou em intervalos mais longos, fora do contexto de vida de um Session do Hibernate.