Gente, alguem ja viu esse erro antes? Quando eu tento pegar o nome do funcionario acontece um erro. mas quando eu pego so o objeto ( f ). Quando eu faço ( f.nome ). da erro.
Podem me ajudar?
[code]
public class Main {
public static void main(String[] args){
EntityManagerFactory entityFactory = Persistence.createEntityManagerFactory("projtcc");
EntityManager entityManager = entityFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery<Funcionario> query = entityManager.createQuery("SELECT f.nome FROM Funcionario f where f.posicao.nomePosicao='Analista 1'", Funcionario.class);
System.out.println(query.getResultList());
entityManager.close();
entityFactory.close();
}
}[/code]
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread “main” java.lang.IllegalArgumentException: Type specified for TypedQuery [modelo.Funcionario] is incompatible with query return type [class java.lang.String]
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:286)
at CRUD.Main.main(Main.java:33)
TypedQuery<Funcionario> funcionario = entityManager.createQuery("SELECT f FROM Funcionario f where f.posicao.nomePosicao='Analista 1'", Funcionario.class);
Retorne o objeto funcionário inteiro e depois acesse o atributo que desejar. Só que no lugar de query, crie uma namedQuery, porque esta é compilada e testada assim que o EntityManagerFactory é criado.
Estou usando o seu exemplo com query. Mudar para namedQuery é fácil, só dar uma lida em um desses livros de hibernate que tem na Internet.
public class Main {
public static void main(String[] args){
EntityManagerFactory entityFactory = Persistence.createEntityManagerFactory("projtcc");
EntityManager entityManager = entityFactory.createEntityManager();
entityManager.getTransaction().begin();
// a mudança é aqui: você retorna uma lista de funcionários, e não uma lista de string apenas com o nome.
TypedQuery<Funcionario> query = entityManager.createQuery("SELECT f FROM Funcionario f where f.posicao.nomePosicao='Analista 1'", Funcionario.class);
List<Funcionario> funcionarios = query.getResultList();
for(Funcionario funcionario : funcionarios) {
System.out.println(funcionario.getNome());
}
entityManager.close();
entityFactory.close();
}
}
Só fique esperto com o seguinte: hibernate tem problema com o uso de TypedQuery<?> quando você faz projeções. Nem mesmo a versão 3.6 resolve este problema, mas parece que uma solução já foi proposta para a versão 3.6.1.
Pow brother, muito obrigado! Assim que chegar em casa eu tentarei seu codigo. Depois eu deixo uma resposta aqui sobre o que aconteceu. Obrigado a todos pela atenção!