[Resolvido] Hibernate Foring Key

17 respostas
V

Galera tenho esse método que consulta um aluno passando sua matricula e instituicao a qual ele pertence. O que eu quero é que ele retorne o Aluno
que possuí essa matricula e instituicao e que esteja com status ativo. Entretanto o hibernate me lança uma exceção dizendo que não consegue resolver
a propriedade instituicao que é uma chave estrageira de outra tabela como posso solucionar tal problema agradeço ajuda..

public Aluno consultarAluno(String matricula,String instituicao) {

		Aluno aluno= new Aluno();
		boolean state=true;
		
		session = CreateSessionFactory.openSession();
		tx = session.beginTransaction();
		
		String query="from Aluno a where a.cpfMatricula=:matricula and a.status=:state and a.identificador=instituicao"; 
		
		aluno=(Aluno) session.createQuery(query).setParameter("matricula", matricula).setParameter("state", state).
		setParameter("instituicao", instituicao);
		
		return aluno;
		
	}

17 Respostas

drsmachado

Como estáo os relacionamentos?

I

você está passando o parametro instituição sem os dois pontos na frente

a.identificador=instituicao

quando o correto é

a.identificador=:instituicao
V

Ainda sim cara ele apresenta a mesma falha mesmo eu colocando o : ele diz que não consegue
resolver a propriedade identificador. Essa propriedade é uma chave estrageira agradeço ajuda…

I

geralmente esse tipo de erro ocorre comigo quando eu erro o nome do atributo na classe, por exemplo vc declarar na sua classe aluno como ident e chamar na hql como identificador, lembrando que hql é o nome do atributo e não o nome da coluna no banco, posta seu código ai, e o stack trace também se for possível

V

Minha classe aluno e seus atributos o método consultar é o mesmo a diferença é que eu coloquei os : e o stak segue abaixo.

@Entity
@Table(name = "Aluno")
public class Aluno extends Usuario {

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idTurma", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	private Turma turma;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "identificador", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	private Instituicao instituicao;

	@OneToMany(mappedBy = "aluno", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Resposta> respostas;

stak

Exception in thread "main" org.hibernate.QueryException: could not resolve property: identificador of: br.com.simuladoOnline.negocio.entidades.Aluno [from br.com.simuladoOnline.negocio.entidades.Aluno a where a.cpfMatricula=:matricula and a.status=:state and a.identificador=:instituicao]
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1362)
	at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
	at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:386)
	at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:566)
	at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:241)
	at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:188)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
	at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:727)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1216)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4041)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3525)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1762)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1690)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1627)
	at br.com.simuladoOnline.persistencia.RepositorioAluno.consultarAluno(RepositorioAluno.java:68)
	at br.com.simuladoOnline.teste.TesteConsultas.main(TesteConsultas.java:20)

O main por onde venho testando o programa.

public class TesteConsultas {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	

		RepositorioAluno r = new RepositorioAluno();
		
		
		
		System.out.println(r.consultarAluno("CEMA123456789", "CEMA").getNome());
		
	}

}
I

opa, ta la o erro rsssss, se vc quer procurar pelo atributo identificador que está dentro da classe Instituição, sua HQL deveria ser mais ou menos assim

from Aluno a where a.cpfMatricula = :matricula and a.status = :status and a.instituicao.identificador = :instituicao

Isso se dá pq a classe Aluno não possui o atributo identificador, então o Hibernate não consegue achar

V

Cara agora apresentou esse erro caramba agradeço pela ajuda tá quase lá… Só mais um pouco…

Exception in thread "main" java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to br.com.simuladoOnline.negocio.entidades.Aluno
	at br.com.simuladoOnline.persistencia.RepositorioAluno.consultarAluno(RepositorioAluno.java:68)
	at br.com.simuladoOnline.teste.TesteConsultas.main(TesteConsultas.java:14)
V

Resolvido vlw veih esqueci do UniqueResult tb agradeço pela ajuda hehe vlw mesmo…

I

opa, disponha hehe

V

Cara desculpa incomodar mais uma vez mas tipo e se eu quiser fazer uma consulta com like como é q eu faço. Acredito que o erro
esteja na query agradeço mais uma vez.

String query="from Aluno a where a.nome like criterio and a.status=:state and a.instituicao.identificador=:instituicao";
V

Stak

Exception in thread "main" org.hibernate.QueryParameterException: could not locate named parameter [criterio] at org.hibernate.engine.query.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:75) at org.hibernate.engine.query.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:81) at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:413) at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:383) at br.com.simuladoOnline.persistencia.RepositorioAluno.listaAluno(RepositorioAluno.java:81) at br.com.simuladoOnline.teste.TesteConsultas.main(TesteConsultas.java:16)

I

vc ta passando como parametro né?

like :criterio

Sempre com dois pontos quando se trata de parametro

V

To passando como parametro sim e funcionou mas como eu faço para encontra em qualquer lugar do nome do cara esse criterio
como fica a query.

I

não tenho certeza, mas tenta fazer assim

like '%':criterio'%'

se não der certo, tenta contactenar o % ao inicio e final do seu criterio antes de passar ele como parametro.

V

Não funcionou cara :? em nenhuma das duas situações.A primeira que você sugerio da problema e concatenando não exibe 0. Vou passar como está o código
pra vc visualizar.

public Collection<Aluno> listaAluno(String criterio,String instituicao) {

		boolean state=true;
					
		session = CreateSessionFactory.openSession();

		String query="from Aluno a where a.nome like '%':criterio'%' and a.status=:state and a.instituicao.identificador=:instituicao";
		
		
		List c = session.createQuery(query).setParameter("criterio", criterio).
		setParameter("state", state).setParameter("instituicao",instituicao).list();

		return c;

	}
I

vc fazendo um String nomeAluno = "%"+criterio+"%"; não deu certo?

com a sua hql

String query="from Aluno a where a.nome like :nomeAluno and a.status=:state and a.instituicao.identificador=:instituicao"

e fazendo um setParameter("nomeAluno",nomeAluno)

ai já não sei mais também rsssss, teria que abrir a documentação do Hibernate e dar uma lida sobre like.

V

resolveu brother tive q setar fora mesmo vlw msm foi uma concatenação tronxa aqui q eu fiz kkkkkk mas agora tá na boa…

Criado 27 de maio de 2011
Ultima resposta 27 de mai. de 2011
Respostas 17
Participantes 3