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?