Dúvida select com lista [Hibernate]

Olá caro colegas

Estou deparado com um problema muito problematico mesmo :stuck_out_tongue:

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.

Existe isso:

[quote]10.2.7.2. JPQL Constructor Expressions

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…

Referência:
http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html

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=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

Ok porem estes objetos podem ser Listas e Mapas ou apenas objetos individuais?

Funciona em qualquer banco.

Entendi sua dúvida, seria isso:

Você tem um construtor assim new XXX(int,double,String,ARRAYLIST);

Você quer saber ser pode dar um select assim:

É isso que gostaria de saber?

E outra coisa como eu posso retornar esta query em um objeto Titulo por exeplo.

Criei o construtor

public Titulo(Cliente cliente, Double vlTotal, List<ImpostoRetido> impostoRetido){ setCliente(cliente); setVlTotal(vlTotal); setImpostoRetido(impostoRetido); }

e fiz a query

filter.setSelect("NEW Titulo(t.cdCliente, t.vlTotal, (Select coalesce(i.vlImposto,0) from ImpostoRetido i where i.impostoRetidoPK.nuTitulo = t.tituloPK.nuTitulo) )");

filter.setFrom("Titulo t inner join t.cliente cli inner join t.documento doc left join  t.impostoRetido impRet ");

Quando eu faço um List listTitulo = find(filter);

ele da a seguinte mensagem

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?

obrigado

Conseguiu resolver?

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

Construtores

[code]public ImpressaoEntrega(int codigo, List impressaoEntregaNotas) {
super();
this.codigo = codigo;
this.impressaoEntregaNotas = impressaoEntregaNotas;
}

public ImpressaoEntregaNota(int sequencia) {
super();
this.sequencia = sequencia;
}[/code]

Estou com o mesmo problema alguem?

preciso passar um list no contrutor…

NamedQuery;
SELECT new br.com.vh.concursos.persistence.dto.vagas.DTOUsuario(u.id,u.arquivoList) FROM Usuario u

Construtor;
public DTOUsuario(Long id, List arquivoList) {
this.id = id;
this.arquivoList = arquivoList;
}