Consulta em hibernate

11 respostas
V

Galera como é que eu faço uma consulta em uma tabela de relacionamento usando hibernate. Exemplo eu quero a aplicação liste todos os professores que fazem parte de uma determinada instituição entretanto o relacionamento entre professor e instituição é ManyToMany e por isso eu tenho uma nova tabela chamada professorInstituicao. O meu método
que lista os professores ficou da seguinte forma. Do jeito que está não funciona por que ele não consegue resolver o atributo identificador dentro da entidade professor porque esse
atributo é do relacionamento e está em outra tabela agradeço a ajuda mais uma vez :(

@SuppressWarnings("unchecked")
	public Collection<Professor> listarTodosProfessores(String instituicao) {

		boolean state=true;
		
		session = CreateSessionFactory.openSession();
		
		Criteria c = session.createCriteria(Professor.class).add(Restrictions.eq
				("instituicao.identificador", instituicao)).add(Restrictions.eq("status",state));

		return c.list();

	}

11 Respostas

Kanin_Dragon

Jovem,
Post os mapeamentos das ORM.

Abs,

V

Mapeamento entidade Instituição

@ManyToMany(fetch=FetchType.LAZY) @JoinTable(name="Instituicao_professor",joinColumns={@JoinColumn(name="identificador") } ,inverseJoinColumns={@JoinColumn(name = "cpfMatricula")}) @Cascade(CascadeType.ALL) private Collection<Professor> professores;

Mapeamento entidade professor

@ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "Instituicao_professor", joinColumns = { @JoinColumn(name = "cpfMatricula") }, inverseJoinColumns = { @JoinColumn(name = "identificador") }) private Collection<Instituicao> instituicoes;

Kanin_Dragon

Jovem,

Entendi o seu questionamento.

Faça conforme o código abaixo:

Obs.: Para facilitar sempre implemente o seu código desta forma, fica mais facil para dar manutenção.

@SuppressWarnings("unchecked")
	public Collection<Professor> listarTodosProfessores(String instituicao) {

		boolean state=true;
		
		session = CreateSessionFactory.openSession();
		
		Criteria c = session.createCriteria(Professor.class,"professor");
                c.createAlias("professor.instituicoes", "instituicoes", Criteria.LEFT_JOIN); //adicionei esta linha
                c.add(Restrictions.eq("instituicoes.identificador", instituicao));
	        c.add(Restrictions.eq("status",state));

		return c.list();
	}

Abs,

V

tá dando esse erro aqui brother

Exception in thread "main" org.hibernate.QueryException: could not resolve property: professor of: br.com.simuladoOnline.negocio.entidades.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.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:204)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:191)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:81)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:60)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1554)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.com.simuladoOnline.persistencia.RepositorioProfessor.listarTodosProfessores(RepositorioProfessor.java:92)
	at br.com.simuladoOnline.teste.TesteConsultas.main(TesteConsultas.java:20)
J

O problema provavelmente está na entidade Instituicao, como ela esta implementada ? Existe uma referencia para a entidade Professor exatamente com a string “professor” ?

Kanin_Dragon

Jovem,

Post as ORM Professor e Instituição com todos o atributos e o metodo da classe DAO que faz a consulta.

Abs,

V

Instituição

@Entity
@Table(name = "instituicao")
public class Instituicao {

	@Id
	private String identificador;

	@Column(name = "nome")
	private String nome;

	@OneToMany(mappedBy = "instituicao", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Turma> turmas;

	@OneToOne
	@JoinColumn(name = "idUsuario")
	@Cascade(CascadeType.SAVE_UPDATE)
	private Coordenador coordenador;

	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="Instituicao_professor",joinColumns={@JoinColumn(name="identificador") }
	,inverseJoinColumns={@JoinColumn(name = "cpfMatricula")})
	@Cascade(CascadeType.ALL)
	private Collection<Professor> professores;
	
	private boolean status;

	@OneToMany(mappedBy = "instituicao", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Aluno> alunos;
	
	@OneToMany(mappedBy="instituicao")
	@Cascade(CascadeType.ALL)
	private Collection<Disciplina>disciplinas;

	private String telefone;
	private String email;
	private String estado;
	private String cidade;
	private String bairro;
	private String rua;
	private String cep;
	private String numero;
	private String complemento;
	private String dominio;

	public Instituicao(String identificador, String nome,
			Collection<Turma> turmas, Collection<Professor> professores,boolean status,
			Collection<Aluno> alunos, Coordenador coordenador, Collection<Disciplina> disciplinas ,String telefone,
			String email, String estado, String cidade, String bairro,
			String rua, String cep, String numero, String complemento,
			String dominio) {

		this.identificador = identificador;
		this.nome = nome;
		this.turmas = turmas;
		this.coordenador = coordenador;
		this.professores = professores;
		this.status=status;
		this.alunos = alunos;
		this.disciplinas=disciplinas;
		this.telefone = telefone;
		this.email = email;
		this.estado = estado;
		this.cidade = cidade;
		this.bairro = bairro;
		this.rua = rua;
		this.cep = cep;
		this.numero = numero;
		this.complemento = complemento;
		this.dominio = dominio;
	}

Professor

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

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "Instituicao_professor", joinColumns = { @JoinColumn(name = "cpfMatricula") }, inverseJoinColumns = { @JoinColumn(name= "identificador") })
	private Collection<Instituicao> instituicoes;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "disciplina_professor", joinColumns = { @JoinColumn(name = "cpfMatricula") }, inverseJoinColumns = { @JoinColumn                 (name= "idDisciplina") })
	// @Cascade(CascadeType.ALL)
	private Collection<Disciplina> disciplinas;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "turma_professor", joinColumns = { @JoinColumn(name = "cpfMatricula") }, inverseJoinColumns = { @JoinColumn(name="idTurma") })
	private Collection<Turma> turmas;

	@OneToMany(mappedBy = "professor", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Questao> questoes;

	public Professor(String nome, String cpfMatricula, String senha,
			String privilegio,boolean status, String email,
			Collection<Instituicao> instituicoes,
			Collection<Disciplina> disciplinas, Collection<Turma> turmas,
			Collection<Questao> questoes, String telefone, String celular) {

		super(nome, cpfMatricula, senha, telefone, celular, email,status ,privilegio);

		this.instituicoes = instituicoes;
		this.disciplinas = disciplinas;
		this.turmas = turmas;
		this.questoes = questoes;

	}
wagnerfrancisco

Só pra entender melhor o problema, se você já sabe qual é a Instituição e Instituição tem um relacionamento com Professor, você não precisaria executar apenas:

algumaInstituicao.getProfessores();

Ou eu não entendi exatamente a função da consulta.

Abraço.

V

Não pq os professores são de vários colégios e eu tenho uma tabela de relacionamento e to querendo apreender também a manipular essas tabelas pra fazer
consultas um pouco mais avançadas, galera vamo lá não sei oq fazer mais dá mais uma forçinha q sai …agradeço msm…

J

Você criou a entidade Instituicao_professor pra resolver a questão do relacionamento ser many to many ?

wagnerfrancisco

vinkello:
Não pq os professores são de vários colégios e eu tenho uma tabela de relacionamento e to querendo apreender também a manipular essas tabelas pra fazer
consultas um pouco mais avançadas, galera vamo lá não sei oq fazer mais dá mais uma forçinha q sai …agradeço msm…

Mas você não quer pesquisar somente os Professores de uma Instituição? Se for assim não faz sentido criar uma query pra isso. A sua instituição já vai conter todos os professores dela, mesmo que os professores possam pertencer a outras instituições também.

O problema é que você tá pensando a nível de base de dados, e não a nível de objetos. Quando você usa o Hibernate, pense em como os objetos se relacionam.

Criado 7 de junho de 2011
Ultima resposta 7 de jun. de 2011
Respostas 11
Participantes 4