Erro org.hibernate.hql.internal.ast.QuerySyntaxException: pessoa is not mapped

Bom dia!

Estou com o seguinte erro quando realizo a query do método buscaPessoaPorUsuario do PessoaDao:

  Hibernate: select usuario0_.id as id1_4_, usuario0_.cadastroAtivado as cadastro2_4_, usuario0_.dataCadastro as dataCada3_4_, usuario0_.email as email4_4_, usuario0_.senha as senha5_4_ from Usuario usuario0_ where usuario0_.email=?
mar 24, 2020 11:08:25 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/controledepeso] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: pessoa is not mapped [select p from pessoa p where usuario_id = :usuario_id]] with root cause org.hibernate.hql.internal.ast.QuerySyntaxException: pessoa is not mapped

Classe LoginController

@Controller
public class LoginController {

	@Autowired
	private UsuarioDAO usuarioDao;
	
	@Autowired
	private PessoaDAO pessoaDao;
	
	@RequestMapping("efetuaLogin")
	public String efetuaLogin(Usuario usuario, HttpSession session, Model model) {
		
		System.out.println("Acessando Login");
		
		Usuario usuariologado = (Usuario) usuarioDao.loadUserByUsername(usuario.getEmail());
		
		if (usuariologado != null) {

			Pessoa pessoa = pessoaDao.buscaPessoaPorUsuario(usuariologado);
			System.out.println(pessoa.getNome());
			session.setAttribute("usuarioLogado", pessoa);
			return "redirect:meusDados";
			
		} else {
			System.out.println("Usuário não existe");
			return "cadastro/form-login";
		}
		
	}
}

Classe PessoaDao

@Repository
public class PessoaDAO {

	@PersistenceContext
	private EntityManager manager;

	public void save(Pessoa pessoa) {
		manager.persist(pessoa);
	}

	public Pessoa findOne(Integer id) {
		return manager.find(Pessoa.class, id);
	}
	
	public Pessoa buscaPessoaPorUsuario(Usuario usuario) {
		
		Pessoa pessoa = (Pessoa) manager.createQuery("select p from pessoa p where usuario_id = :usuario_id", Pessoa.class)
								.setParameter("usuario_id", usuario.getId())
								.getResultList();
		
		return pessoa;
	}
}

Configuração do banco
@EnableTransactionManagement
public class JPAConfiguration {

	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
		LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
		em.setDataSource(dataSource());
		em.setPackagesToScan(new String[] {"br.com.moreira.controledepeso.model"} );

		JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
		em.setJpaVendorAdapter(vendorAdapter);
		em.setJpaProperties(additionalProperties());

		return em;
	}

	@Bean
	public DataSource dataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/controlepeso?serverTimezone=UTC");
		dataSource.setUsername("admin");
		dataSource.setPassword("");

		return dataSource;
	}

	private Properties additionalProperties() {
		Properties properties = new Properties();
		properties.setProperty("hibernate.hbm2ddl.auto", "update");
		properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
		properties.setProperty("hibernate.show_sql", "true");
		return properties;
	}
	
	@Bean
	public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
		JpaTransactionManager transactionManager = new JpaTransactionManager();
		transactionManager.setEntityManagerFactory(emf);
		return transactionManager;
	}

}

O mapeamento das entidades não está sendo realizado no setPackagesToScan apontando para as entidades do pacote model?

O createQuery usa HQL, a escrita deve ser com base nas suas entidades, e pelo que me parece você está usando SQL puro, neste caso deveria estar utilizando createNativeQuery.

1 curtida

Jonathan, muito obrigado!

Alterei para createNativeQuery e funcionou.

Depois vou verificar como ficaria em HQL, trocar para testar também. Muito obrigado!

Fiz o teste e funcionou das duas maneiras:

Com SQL Puro:

	public Pessoa buscaPessoaPorUsuario(Usuario usuario) {
		
		System.out.println("UsuarioID " + usuario.getId());
		
		Pessoa pessoa = (Pessoa) manager.createNativeQuery("select * from pessoa where usuario_id = :usuario_id", Pessoa.class)
								.setParameter("usuario_id", usuario.getId())
								.getSingleResult();
		
		return pessoa;
	}

Com HQL:

	public Pessoa buscaPessoaPorUsuario(Usuario usuario) {
		
		System.out.println("UsuarioID " + usuario.getId());
		
		Pessoa pessoa = (Pessoa) manager.createQuery("from Pessoa where usuario = :usuario_id", Pessoa.class)
								.setParameter("usuario_id", usuario)
								.getSingleResult();
		
		return pessoa;
	}
2 curtidas