Passando objeto como parâmetro

Olá pessoal,

Passando meus primeiros parâmetros tive um problema.

Aqui seleciono meu tipo:

ContaTipo ct = (ContaTipo) em.createQuery(“Select t FROM ContaTipo t WHERE t.tipoId =” + 1).getSingleResult();

Blz, consigo pega-lo sem qq problema.

Mas aqui.

    Query query = em.createQuery("Select c FROM Conta c WHERE c.tipoId =" + ct);
    Collection<Conta> lsConta = query.getResultList()

Sendo que tipoId é do tipo ContaTipo.
Teoricamente, n deveria funcionar?

Não consigo, de todas as formas q tentei deu este erro:

Exception in thread “main” Local Exception Stack:
Exception [TOPLINK-8026] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EJBQLException
Exception Description: Syntax error parsing the query [Conta.ContaPorTipo: Select c FROM Conta c WHERE c.tipoId =: ContaTipo], line 1, column 40: unexpected char [ ].

Grato,

Amigo,
você esta tentando invocar isso dentro do metodo main???

Opa,

Sim, num mesmo método.

E tah f… pq…

Se faço:
Query query = em.createQuery("Select c.tipoId FROM Conta c);

Eu tenho os tipos da minha tabela Conta, mas se coloco uma cláusula WHERE, ferra!

O retorno do getResultList deve ser convertido.

Collection<Conta> lsConta = (Collection<Conta>) query.getResultList();

att,

Mesmo erro! :frowning:

    ContaTipo ct =  (ContaTipo)  em.createQuery("Select t FROM ContaTipo t WHERE t.tipoId =" + 2).getSingleResult();

    Collection<Conta> lsConta;

    lsConta = (Collection<Conta>) em.createQuery("select c.tipo from Conta c WHERE c.tipo=" + ct).getResultList();


    for(Conta conta : lsConta)
        System.out.println(conta.getDescricao());

Ops! Desculpe! Não li direito! :?

O erro está quando a query vai ser executada. No primeiro exemplo funciona pq vc está passando direto o id.

Quando vc faz:

("Select c FROM Conta c WHERE c.tipoId =" + ct); 

Vc está concatenando a query o Objeto ct. Então, será chamado o metodo toString() do objeto ct que retorna o estado atual do seu objeto.
Vc pode subscrever o metodo toString() retornando o tipoId no seu objeto ct ou criar um metodo que retorne o tipoId, tipo um getTipoId() e usa-lo para criar a query!

Então,

Eu tinha feito aqui assim.

lsConta = em.createQuery(“select c.tipo from Conta c WHERE c.tipo.ID=” + ct.ID).getResultList();

ao invés de

lsConta = em.createQuery(“select c.tipo from Conta c WHERE c.tipo=” + ct).getResultList();

Funcionou.

Mas valeu a ajuda!!!