Erro jpa

4 respostas
J

oi galera

to tentando fazer uma consulta com um campo String e está lançando uma exceção “NoResultException”, sendo que existe esse registro no banco.

Minha consulta é essa:

String hql = "SELECT c FROM Cadastro c WHERE c.codigounico =:pCodigoUnico ";
			Query query = getEntityManager().createQuery(hql).setParameter("pCodigoUnico", codigo);
			cadastro = (Cadastro)query.getSingleResult();

Eu passo o codigo 1140 e no banco existe. Se eu faço a consulta sql manualmente no banco, ele localiza. Se ele faz a consulta por essa String hql, não traz nada.

Alguem sabe porque?

É como se tivesse enviando uma consulta dessa

select * from Cadastro where codigounico = 1140

dai não traz nada mesmo

e mandando com aspas, traz resultado

select * from Cadastro where codigounico = "1140"

4 Respostas

J

Olá, talvez com aspas funcione pois o tipo dentro do banco deve ser VARCHAR() e não INT.

Verifique se sua classe (a qual a sua query faz referência) possui o “pCodigoUnico” como String (que é compatível ao utilizar o JPA) e não int. (Que seria o motivo de ele não estar colocando o “pCodigoUnico” entre aspas).

J

no banco ta como character varyng e na entidade ta como String. Mas não funciona

ele nao traz registro, sendo que existe

J

pessoal, eu consegui resolver o problema do jeito mais feio
fiz assim e funcionou

String hql = "SELECT c FROM Cadastro c WHERE c.codigoUnico ='" + codigoUnico + "'"; TypedQuery<Cadastro> query = getEntityManager().createQuery(hql, Cadastro.class); return query.getSingleResult();

mas assim tb deveria funcionar, e não voltou corretamente. Sendo que assim, seria a forma mais correta (passando parametro)

String hql = "SELECT * FROM Cadastro c WHERE c.codigoUnico =:pCodigoUnico"; Query query = getEntityManager().createQuery(hql).setParameter("pCodigoUnico", codigoUnico ); cnae = (Cadastro)query.getSingleResult();

queria entender porque o jpa nao conseguiu entender como String o parametro passado e nao adicionou as aspas

J

Não existe a possibilidade de usar NamedQueries em sua aplicação? Tenho uma como exemplo disso… (estava desenvolvendo isso ontem… veja que nem a exceção eu tratei ainda, e os comentários do DAO que eu tinha criado anteriormente ainda estão ali… rsrsrs)

Genero.java:

import java.io.Serializable;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Column;

@Entity
@Table(name="genero")
@NamedQueries({
	@NamedQuery(name = "Genero.findAll", query = "SELECT g FROM Genero g")
})
public class Genero implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name="gecode", nullable=false, columnDefinition="integer")
	@Min(value = 0, message="O código deve ser positivo!")
	private int gecode;
	
	@Column(name="descricao", nullable=false, length=50)
	@Size(min = 2, max = 50, message="O gênero especificado deve ter entre 2 e 50 caracteres!")
	private String descricao;

	public int getGecode() {
		return gecode;
	}

	public void setGecode(int gecode) {
		this.gecode = gecode;
	}

	public Genero() {
	}

	public Genero(int gecode, String genero) {
		this.gecode = gecode;
		this.descricao = genero;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setGenero(String descricao) {
		this.descricao = descricao;
	}

}

e, para chamar ele no controller, fiz assim:

public List<Genero> getGeneroList() throws Exception {
	synchronized (this) {
		try {
			EntityManagerFactory emf = Persistence.createEntityManagerFactory("JHOC");
			em = emf.createEntityManager();
			generoList = castList(Genero.class, em.createNamedQuery("Genero.findAll").getResultList());
		} catch (NoResultException nre) {
			// TODO: handle exception
		}
		/*DAOGenero daoGenero = new DAOGeneroMySql();
		generoList = daoGenero.listar();*/
		return generoList;
	}
}

Como pode ver, eu utilizo o EntityManager e invoco o método createNamedQuery passando o nome da minha query nomeada. No começo achei estranho, porém o código fica muito mais limpo.

Criado 28 de agosto de 2011
Ultima resposta 30 de ago. de 2011
Respostas 4
Participantes 2