Mapeamento Hibernate Property Access e Field Access [RESOLVIDO]

2 respostas
jpqljpaprogramaçãohibernatejava
T

Oi pessoal, estou com um problema com o hibernate. Estou criando uma aplicação no JavaFX, e utilizando o hibernate pra mapear as minhas classes de entidade.

O problema é que o Hibernate não identifica os tipos que eu estou usando na hora de persistir os objetos no banco de dados, já que determinei os tipos como StringProperty e IntegerProperty no lugar de String e Integer. Pra consertar esse erro, coloquei as anotações das propriedades da minha classe nos getters, pra eu poder fazer a conversão dos tipos (StringProperty para String e IntegerProperty pra Integer), ficando assim o mapeamento:

@Entity
@Table(name = "tbArquivo")
public class Arquivo {

	@Transient
	private IntegerProperty idArquivo = new SimpleIntegerProperty();
	@Transient
	private StringProperty nomeArquivo = new SimpleStringProperty();
	@Transient
	private StringProperty localidadeExterna = new SimpleStringProperty();
	@Transient
	private StringProperty generoMusical = new SimpleStringProperty();

	@OneToOne(mappedBy = "arquivo")
	private Artista artista;

	public Arquivo() {

	}

	public Arquivo(String nomeArquivo, String localidadeExterna, String generoMusical) {
		super();
		this.nomeArquivo.set(nomeArquivo);
		this.localidadeExterna.set(localidadeExterna);
		this.generoMusical.set(generoMusical);
	}

	@Override
	public String toString() {
		return "Arquivo [nomeArquivo=" + nomeArquivo + ", localidadeExterna=" + localidadeExterna + ", generoMusical="
				+ generoMusical + "]";
	}

	public IntegerProperty idArquivoProperty() {
		return this.idArquivo;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getIdArquivo() {
		return this.idArquivoProperty().get();
	}

	public void setIdArquivo(final int idArquivo) {
		this.idArquivoProperty().set(idArquivo);
	}

	public StringProperty nomeArquivoProperty() {
		return this.nomeArquivo;
	}

	@Column(name = "nomeArquivo")
	public String getNomeArquivo() {
		return this.nomeArquivoProperty().get();
	}

	public void setNomeArquivo(final String nomeArquivo) {
		this.nomeArquivoProperty().set(nomeArquivo);
	}

	public StringProperty localidadeExternaProperty() {
		return this.localidadeExterna;
	}

	@Column(name = "localidadeExterna")
	public String getLocalidadeExterna() {
		return this.localidadeExternaProperty().get();
	}

	public void setLocalidadeExterna(final String localidadeExterna) {
		this.localidadeExternaProperty().set(localidadeExterna);
	}

	public StringProperty generoMusicalProperty() {
		return this.generoMusical;
	}

	@Column(name = "generoMusical")
	public String getGeneroMusical() {
		return this.generoMusicalProperty().get();
	}

	public void setGeneroMusical(final String generoMusical) {
		this.generoMusicalProperty().set(generoMusical);
	}

}

Até aí tudo bem, estava conseguindo persistir normalmente para o banco, mas o problema surgiu quando eu precisei criar um Query que retornava uma lista de registros específicos, e precisava acessar os atributos da classe via JPQL.
O método que faz esse acesso é esse:

package pacoteDAO;

import java.util.List;

import javax.persistence.TypedQuery;

import pacote.Artista;





	public List<String> retornaLocalidadesInternas(int idArquivo) {
		TypedQuery<String> tq = EntityManagerUtil.getEntityManager().createQuery(
				"SELECT DISTINCT a.localidadeInterna FROM Artista a JOIN a.arquivo WHERE ar.idArquivo = :id",
				String.class);
		tq.setParameter("id", idArquivo);
		return tq.getResultList();
	}

Quando executei o código, gerou uma Exception com a seguinte mensagem:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: ‘ar.idArquivo’ [SELECT DISTINCT a.localidadeInterna FROM pacote.Artista a JOIN a.arquivo WHERE ar.idArquivo = :id]

No final das contas, minha dúvida é a seguinte: Como eu faço pra acessar o getter da minha classe pela Query do JPA?

2 Respostas

S

O alias que você deu para Artista é 'a' e não 'ar'

T

hahahahahha estou até me sentindo burro aqui, já que era um erro bem bobo. Obrigado por me mostrar.

Criado 22 de dezembro de 2016
Ultima resposta 22 de dez. de 2016
Respostas 2
Participantes 2