Estou deparado com um problema muito problematico mesmo
Preciso fazer um select como hibernate que busque apenas campos selecionados de tabelas distintas. Neste select eu utilizo left joins para buscar dados distintos.
Utilizando o comando setSelect(“tabela”), eu consigo popular as ArrayList da classe tabela, porém junto com a lista carregada, me retorna uma série de objetos que eu não utilizo. Por isso preciso selecionar apenas os campos necessários, e as tabelas que estão com left join(possíveis Listas) eu preciso colocar dentro da lista desta minha classe.
Como eu posso fazer este select em que as colunas que eu busque preencham uma arraylist da classe da tabela selecionada.
Lembrando que estou perguntando isto pela performace da consulta.
Caso eu não tenha sido muito objetivo avise por favor.
in the SELECT Clause A constructor may be used in the SELECT list to return one or more Java instances. The specified class is not required to be an entity or to be mapped to the database. The constructor name must be fully qualified.
If an entity class name is specified in the SELECT NEW clause, the resulting entity instances are in the new state.
SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price)
FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00[/quote]
Você pode criar um construtor que tenha somente os campos que precisa e fazer um select com construtor… barbada…
Interessante, porém este comando funciona em qualquer banco de dados ou especifico Oracle?
Outra coisa é se por acaso eu tiver uma ArrayList de price por exemplo, e eu tenho um left join nesta tabela price. Esta List é automaticamente populada com este comando?
[quote=gurumen]Interessante, porém este comando funciona em qualquer banco de dados ou especifico Oracle?
Outra coisa é se por acaso eu tiver uma ArrayList de price por exemplo, e eu tenho um left join nesta tabela price. Esta List é automaticamente populada com este comando?
abraço[/quote]
funciona em qualquer banco de dados. Tal ação vem do hibernate e é uma forma de popular o objeto após as consultas
Então como a própria exceção já diz, não existe um contrutor com:
do jeito que está, ele está gerando isso para um construtor, pq vc está selecionando uma lista de valores tipo double, oq vc pode fazer é o seguinte…
filter.setSelect("NEW Titulo(t.cdCliente, t.vlTotal,
(Select i from ImpostoRetido i where i.impostoRetidoPK.nuTitulo = t.tituloPK.nuTitulo) )");
Com o construtor completo de ImpostoRetido.
Ou criar um construtor em ImpostoRetido assim:
mas dai a JPQL ficaria assim:
filter.setSelect("NEW Titulo(t.cdCliente, t.vlTotal,
(Select new ImpostoRetido(coalesce(i.vlImposto,0)) from ImpostoRetido i where i.impostoRetidoPK.nuTitulo = t.tituloPK.nuTitulo) )");
Com o construtor na lista também…
Obs.: DESCULPA A DEMORA PARA RESPONDER MAS É QUE ESTIVE UM TEMPINHO SEM INTERNET…
Eu fiz isto mais realmente não funcionou, acredito que seja da versão do Hibernate que eu utilizo esteja ultrapassada. Esta funcionalidade funciona a partir de qual versão do Hibernate você saberia me informar?
Encontrou solução para o problema? Estou com um problema semelhante. Tenho um objeto com um construtor que recebe um List como parâmetro, estou utilizando um select para passar o list, mas dá o seguinte erro.
java.lang.UnsupportedOperationException: getDataType() is not supported by ConstructorNode!
segue minha query.
select new pacote.ImpressaoEntrega(entrega.id,
(select new pacote.ImpressaoEntregaNota(entregaNotas.ordem)
from EntregaNotas entregaNotas
where entregaNotas.chaveEntregaNotas.entrega = entrega))
from Entrega entrega