@trickstival escreveu:
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?
Mensagens: 3
Participantes: 2