JPA - ERROR: invalid reference to FROM-clause entry for table "usuario"

0 respostas
M

Boa tarde, Pessoal!

Estou usando JPA com implementaçao do Hibernate e estou tendo o seguinte erro: " ERROR: invalid reference to FROM-clause entry for table "usuario ", este erro ocorre quando o meu metodo tenta buscar uma lista de objetos da classe ProfissionalDaSaude com os seus respectivos Clientes, pelo que eu li na internet um campo da tabela Usuario nao esta sendo acessado, mas ate ai xongas! Nao vi ninguem me dar uma soluçao sucinta, pelo que eu vi de alguns eu deveria abandonar esta jpl , as buscas estao sendo realizadas atraves de JPQLs que estao na classe Usuario, e criar um SQL na mao referenciando campo a campo das tabelas envolvidas? Estou usuando heranca com a estrategia JOINED. Por favor se alguem puder me orientar ficaria grato! Abaixo colocarei as minhas classes que inclusive ja estao devidamente mapeadas. Por favor me ajudem!

Trecho do metodo que esta apresentando problemas:

List listaDeProfissionais = usuarioAppService.recuperaListaDeProfissionaisDaSaudeComClientes();

for (ProfissionalDaSaude usuario : listaDeProfissionais) {

System.out.print(	'\n' + "Id = "  + usuario.getId() + 
	         " Nome = " + usuario.getNome() + 
	         " Login = " + usuario.getLogin() +
	         " Tipo Usuário = "  + usuario.getTipoUsuario().getTipoUsuario() +
                                     " Número de registro = "  + ((ProfissionalDaSaude)usuario).getNumeroDoRegistroProfissional() + 
	        " Tipo Profissional = " + ((ProfissionalDaSaude)usuario).getTipoProfissional().getTipoProfissional() + '\n' );
					
 for (Cliente cliente : usuario.getClientes()) {
						
System.out.print( '\n' + "Id = "  + cliente.getId() + 
		   " Nome = " + cliente.getNome() + 
		   " Login = " + cliente.getLogin() +
		   " Tipo Usuário = "  + cliente.getTipoUsuario().getTipoUsuario() + '\n' ); 
 }

}

================================

Casse: Usuario

@NamedQueries(

{	

@NamedQuery

(	name = Usuario.recuperaListaDeProfissionaisDaSaudeComClientes,

query = "select p from ProfissionalDaSaude p " +

"left outer join fetch p.clientes " +

order by p.id

)

})
@Entity

@Table(name=USUARIO)

@Inheritance(strategy = InheritanceType.JOINED)

@SequenceGenerator(name=SEQUENCIA, sequenceName=SEQ_USUARIO, allocationSize=1)

public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;

public Usuario(){
	
}


/**
 * Identificador do usuário.
 * 
 */
private Long id;

/**
 * Nome do usuário.
 * 
 */
private String nome;

/**
 * Login do usuario
 * 
 */
private String login;

/**
 * Senha do usuário.
 * 
 */
private String senha;

/**
 * Tipo do usuário.
 * 
 */
private TipoUsuario tipoUsuario;

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCIA")
@Column(name="ID")
public Long getId() {
	return id;
}

public void setId(Long id) {
	this.id = id;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getLogin() {
	return login;
}

public void setLogin(String login) {
	this.login = login;
}

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}


@ManyToOne
@JoinColumn(name="TIPO_USUARIO_ID", nullable=false)
public TipoUsuario getTipoUsuario() {
	return tipoUsuario;
}

public void setTipoUsuario(TipoUsuario tipoUsuario) {
	this.tipoUsuario = tipoUsuario;
}

/**
 * Este método poder ser gerado AUTOMATICAMENTE pelo Java, juntamente com o método  "equals(Object obj)".
 * Eles São necessários para determinarmos um criterio de igualdade entre 2 objetos.
 * 
 * Obs.: É primoridal dar atenção para este detalhe, principalmente quando trabalhamos com Estruturas
 * 		 de Dados como Set.
 * 
 * @return int
 */

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((id == null) ? 0 : id.hashCode());
	result = prime * result + ((login == null) ? 0 : login.hashCode());
	result = prime * result + ((senha == null) ? 0 : senha.hashCode());
	return result;
}


/**
 * Este método poder ser gerado AUTOMATICAMENTE pelo Java, juntamente com o método  "hashCode()".
 * Eles São necessários para determinarmos um criterio de igualdade entre 2 objetos.
 * 
 * Obs.: É primoridal dar atenção para este detalhe, principalmente quando trabalhamos com Estruturas
 * 		 de Dados como Set.
 * 
 * @param Object  
 * @return boolean
 */

@Override
public boolean equals(Object obj) {
	if (this == obj) {
		return true;
	}
	if (obj == null) {
		return false;
	}
	if (!(obj instanceof Usuario)) {
		return false;
	}
	Usuario other = (Usuario) obj;
	if (id == null) {
		if (other.id != null) {
			return false;
		}
	} else if (!id.equals(other.id)) {
		return false;
	}
	if (login == null) {
		if (other.login != null) {
			return false;
		}
	} else if (!login.equals(other.login)) {
		return false;
	}
	if (senha == null) {
		if (other.senha != null) {
			return false;
		}
	} else if (!senha.equals(other.senha)) {
		return false;
	}
	return true;
}

}

==========================================

Classe: ProfissionalDASaude

@Entity

@Table(name = PROFISSIONALDASAUDE)

public class ProfissionalDaSaude extends Usuario {
private static final long serialVersionUID = 1L;

/**
 * Atributo que indica o numero do registro do usuario
 * do tipo profissional.
 * 
 */
private String numeroDoRegistroProfissional;

/**
 * Atributo que indica o tipo de profissional.
 * 
 */
private TipoProfissional tipoProfissional;

/**
 * Atributo que indica os clientes do profissional de saúde.
 * 
 */
private List<Cliente> clientes;

public ProfissionalDaSaude() {
	super();
	// TODO Auto-generated constructor stub
}

public String getNumeroDoRegistroProfissional() {
	return numeroDoRegistroProfissional;
}

public void setNumeroDoRegistroProfissional(String numeroDoRegistroProfissional) {
	this.numeroDoRegistroProfissional = numeroDoRegistroProfissional;
}

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="TIPO_PROFISSIONAL_ID", nullable=false)
public TipoProfissional getTipoProfissional() {
	return tipoProfissional;
}

public void setTipoProfissional(TipoProfissional tipoProfissional) {
	this.tipoProfissional = tipoProfissional;
}

//Quando ponho como EAGER ocorre erro.
@OneToMany(mappedBy="profissional",fetch=FetchType.LAZY)
@OrderBy("nome")
public List<Cliente> getClientes() {
	return clientes;
}

public void setClientes(List<Cliente> clientes) {
	this.clientes = clientes;
}

@Override
public String toString() {
	return "ProfissionalDaSaude [numeroDoRegistroProfissional="
			+ numeroDoRegistroProfissional + ", tipoProfissional="
			+ tipoProfissional + ", toString()=" + super.toString() + "]";
}

}

==============================

Classe: Cliente

@Entity

@Table(name = CLIENTE)

public class Cliente extends Usuario {
private static final long serialVersionUID = 1L;

private ProfissionalDaSaude profissional;

public Cliente() {
	super();
	// TODO Auto-generated constructor stub
}

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="PROFISSIONAL_ID", nullable=false)
public ProfissionalDaSaude getProfissional() {
	return profissional;
}

public void setProfissional(ProfissionalDaSaude profissional) {
	this.profissional = profissional;
}

}

Criado 13 de agosto de 2011
Respostas 0
Participantes 1