Selecionar apnas alguns campos em uma query

08/11/2011

0

Bom dia a todos, estou desenvolvendo um projeto utilizando o JPA, e estou com um problema preciso que seja feito um select no banco de dados de apenas alguns campos da minha entidade, para nao ficar pessado a lista de retorno, exemplo:
Entidade pessoa( nome, cpf, endereco, etc...), no momento de criar a query preciso que seja selecionado apenas os campos nome e cpf, conforme exemplo abaixo.
Porem esta dando erro ao executar nao sei se é pela sintaxe.
Tambem gostaria de saber se ao usuar a native queries, tem alguma diferença, pois seria uma saida.

@NamedQueries({
      @NamedQuery(
       Name=”findAllpessoa”,
       Query=”select p.nome, p.cpf from pessoa p ”),
})


Desde já Obrigado
Fernando Luiz.
Fernando Silva

Fernando Silva

Responder

Posts

08/11/2011

Davi Costa

Posta o erro, vai ficar melor de te ajudar.

att Davi
Responder

08/11/2011

Fernando Silva

Obrigado pela atenção amigo, mas acho que estava fazendo algo de errado e tinha desistido rapido.
Ao tentar forca o erro novamente, para postar, funcionou perfeitamente.

Valeu.
Responder

08/11/2011

Robson Teixeira

So uma opinião alheia mas o erro provavel não seria o pessoa com o caracter p em minusculo??? ja que pelo JPQL ele busca os atributos da classe Pessoa.

att
robson
Responder

09/11/2011

Dyego Carmo

Existe um recurso muito legal no JPA/HIBERNATE , utilizar construtores de classe...

vc cria um contrutor com 2 strings nesta sua classe e pode fazer algo do genero:

select new br.com.devmedia.MinhaPessoa(p.nome,p.sobrenome) from MinhaPessoa p;

ele vai criar a classe utilizando o construtor , muito legal ;)
Responder

09/11/2011

Fernando Silva

Existe um recurso muito legal no JPA/HIBERNATE , utilizar construtores de classe...

vc cria um contrutor com 2 strings nesta sua classe e pode fazer algo do genero:

select new br.com.devmedia.MinhaPessoa(p.nome,p.sobrenome) from MinhaPessoa p;

ele vai criar a classe utilizando o construtor , muito legal ;)


Diego voce salvou meu dia, era exatamente isto que precisava, porque eu até consegui selecionar apenas alguns campos, porem o getresultlist vinnha como array de object e nao do tipo que eu queria, ai tive que fazer uma adaptação tecnica para converter para o tipo esperado com demais campos nulos, veja abaixo. Agora resolvi a questao de forma elegante, muito Obrigado a você e aos demais.

Só pra explicar a necessidade disto, é que preciso que as tabelas vinculadas a esta classe sejam carregadas só no momento de edição, e para listar e consultar usuarei só a tabela principal com os campos basicos, ou seja usarei o recurso lazy, só quando necessario sem precisar desabilita-lo, pois ajuda muito na produtividade, não sei se fui claro, mas é isto.

E mais uma vez obrigado

     //Antiga NamedQuery que resultava lista de object
       @NamedQuery(name = GerCliente1.findAll, query = SELECT g.idcodigo1, g.nome1, g.cgcCpf1, g.insestRg1,
                                                          +  g.nomfan1, g.contato1 ,g.obs1, g.insmun1 
                                                          + FROM GerCliente1 g Order By g.idcodigo1 ),
     // Nova NamedQuery que resulta o que eu quero objeto tipo GerCliente1 
    @NamedQuery(name = GerCliente1.findAll, query = SELECT new entidades.ger.GerCliente1(g.idcodigo1, 
                                                      + g.nome1, g.cgcCpf1, g.insestRg1,
                                                      + g.nomfan1, g.contato1 ,g.obs1, g.insmun1) 
                                                      + FROM GerCliente1 g Order By g.idcodigo1 ),

             //Adaptação tecnica para o resultado com a antiga namedquery
            lRetorno = q.getResultList();
            for(int iCount = 0;iCount < lRetorno.size();iCount++){
                cCliente = new GerCliente1();
                vCliente = (Object[]) lRetorno.get(iCount);
                cCliente.setIdcodigo1((Long) vCliente[0]);
                cCliente.setNome1((String) vCliente[1]);
                cCliente.setCgcCpf1((String) vCliente[2]);
                cCliente.setInsestRg1((String) vCliente[3]);
                cCliente.setNomfan1((String) vCliente[4]);
                cCliente.setContato1((String) vCliente[5]);
                cCliente.setObs1((String) vCliente[6]);
                cCliente.setInsmun1((String) vCliente[7]);
                lCliente.add(cCliente);
            }

            return lCliente;

            //Com a que voce passou voltou o que era 
            return q.getResultList();
Responder

09/11/2011

Davi Costa

Show de bola Fernando Luiz. Muito boa a iniciativa de postar sua solução, assim que possível favor fechar o chamado.

att Davi
Responder

09/11/2011

Fernando Silva

Show de bola Fernando Luiz. Muito boa a iniciativa de postar sua solução, assim que possível favor fechar o chamado.

att Davi


Ok, desculpe a bobeira, mas como fecha o chamado ?
Responder

18/11/2011

Dyego Carmo

vEJA NO TOPO DO CHAMADO :)
Responder

19/12/2011

Fernando Silva

vEJA NO TOPO DO CHAMADO :)


Ok, olhei e não vi esta opção de fechar, poderia fechar pra mim, creio que nao tenho acesso.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar