E aí galera, beleza?
Estou começando meus studos em jpa annotation com hibernate mas, ja encontrei um problema.
estou tentando criar uma criteria para buscar um item um nivel no agregação de um vo mas, por algum motivo não consigo, o hibernate informa que o parametro não existe.
Meus mapeamentos:
@Entity
@Table(name="coordenador")
public class Coordenador implements VO{
/**
*
*/
private static final long serialVersionUID = -8910674378340122298L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="matriculacoordenador",unique=true,nullable=false)
private String matriculaCoordenador;
@Column(name="nome",nullable=false,length=45)
private String nome;
@OneToMany(mappedBy="codigo")
private Collection<AgendaAdmissao> agendaAdmissao;
//getters...
//setters
}
@Entity
@Table(name="agendaadmissao")
public class AgendaAdmissao implements VO{
/**
*
*/
private static final long serialVersionUID = -8970168923522573021L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="codigoagenda",unique=true,nullable=false)
private Long codigo;
@Column(name="nomecandidato",nullable=false)
private String nomeCandidato;
@ManyToOne
@JoinColumn(name="matriculacoordenador",nullable=false,insertable=true, updatable=true)
private Coordenador coordenador;
@ManyToOne
@JoinColumn(name="codigocurso",nullable=false,insertable=true, updatable=true)
private Curso curso;
@Column(name="data",nullable=false)
private Date data;
@Column(name="status",nullable=false)
private String status;
//getters...
//setters
}
a criteira está assim:
criteria.add(Expression.eq("coordenador.nome", "Coordenador 2"));
Como podem perceber o parametro “coordenador.nome” está devidamente mapeado.
O engraçado é que se eu buscar pela chave da classe coordenador funcionacorretamente:
criteria.add(Expression.eq("coordenador.matriculaCoordenador", "p100"));
Creio que me esqueci de algo no mapeamento. Se puderem me ajudar eu agradeço.
Opa…
eu tive um problema desses esses tempos atrás…
Seguinte…
Pelo que eu vi no seu código… qdo vc busca pela chave primaria da tabela na criteria, ele busca normalmente, mas c tu for buscar por um campo normal da tabela, ai ele vai dar pau, certo ?
O HQL traz esse suporte de tu conseguir pegar o atributo da tabela, ja se tu for usar criteria, vai precisar fazer um LeftJoint ai, blz ?
E ai cassolato, beleza?
Então cara, eu tenho que especificar explicitamente que eu quero usar um leftjoin?
O engraçado é que com mapeamentos hbm eu consigo fazer essa busca normalmente com criteria e ele faz um inner join.
Muda alguma coisa usando as annotations do jpa?
Opa… kra, eu não vou saber reponder essa questão. Aqui com annotations eu tive que usar HQL pra conseguir fazer o que tu ta tentando. Sobre essa dos mapeamentos hbm é nova para mim. De qualquer modo, se tu conseguir, posta ai que eu tb vou mudar meu código aqui
E aí galera geleza?
Consegui resolver meu problema. O meu problema estava em não utilizar alias para a entidade coordenador.
Fiz algumas alterações nos mapeamentos dos vos e passei a utilizar restrictions mas o que resolvel mesmo foi o alias no criteria.
Os mapeamentos ficaram assim:
Agenda Adimissao
package br.com.fiap.agenda.vo;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="agendaadmissao")
public class AgendaAdmissao implements VO{
/**
*
*/
private static final long serialVersionUID = -8970168923522573021L;
@Id
@Column(name="codigoagenda",length=7)
private Long codigo;
@Column(name="nomecandidato",length=45)
private String nomeCandidato;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="matriculacoordenador")
private Coordenador coordenador;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="codigocurso")
private Curso curso;
@Column(name="data")
private Date data;
@Column(name="status",length=1)
private String status;
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public String getNomeCandidato() {
return nomeCandidato;
}
public void setNomeCandidato(String nomeCandidato) {
this.nomeCandidato = nomeCandidato;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Curso getCurso() {
return curso;
}
public void setCurso(Curso curso) {
this.curso = curso;
}
public Coordenador getCoordenador() {
return coordenador;
}
public void setCoordenador(Coordenador coordenador) {
this.coordenador = coordenador;
}
@Override
public String toString() {
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String string = codigo+"\n"+nomeCandidato+"\n"+format.format(data)+"\n"+status+"\n"+curso.getNome()+"\n"+coordenador.getNome();
return string;
}
}
coordenador:
package br.com.fiap.agenda.vo;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="coordenador")
public class Coordenador implements VO{
/**
*
*/
private static final long serialVersionUID = -8910674378340122298L;
@Id
@Column(name="matriculacoordenador",length=5, unique=true)
private String matriculaCoordenador;
@Column(name="nome",length=45)
private String nome;
@OneToMany(fetch=FetchType.LAZY,mappedBy="coordenador")
private Collection<AgendaAdmissao> agendaAdmissao;
public Collection<AgendaAdmissao> getAgendaAdmissao() {
return agendaAdmissao;
}
public void setAgendaAdmissao(Collection<AgendaAdmissao> agendaAdmissao) {
this.agendaAdmissao = agendaAdmissao;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getMatriculaCoordenador() {
return matriculaCoordenador;
}
public void setMatriculaCoordenador(String matriculaCoordenador) {
this.matriculaCoordenador = matriculaCoordenador;
}
}
O criteria:
criteria.createAlias("coordenador", "c");
criteria.add(Restrictions.eq("c.nome", "Coordenador 1"));
E pór incrivel que pareça o sql foi gerado com inner join:
Hibernate: select this_.codigoagenda as codigoag1_0_1_, this_.matriculacoordenador as matricul5_0_1_, this_.codigocurso as codigocu6_0_1_, this_.data as data0_1_, this_.nomecandidato as nomecand3_0_1_, this_.status as status0_1_, c1_.matriculacoordenador as matricul1_2_0_, c1_.nome as nome2_0_ from agendaadmissao this_ inner join coordenador c1_ on this_.matriculacoordenador=c1_.matriculacoordenador where c1_.nome=?
Valeu pela força galera!