Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Problema em query no banco - login?error

Prezados, estou com problema ao tentar efetura login, que so retorna por parametro da seguinte forma: login?error

Estou utilizando o PostGre.

Com isso, no meu banco a tabela User é composta por colunas (email-PK, name, password). Debugando, descobri que o codigo para na query, mas não é lançando nenhuma exception do tipo "nao encontrado tabela x", "nao encontrado coluna x" ... Simplesmente ele printa o resultado que é:

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

neste caso, três tentativas de login.

Meu palpite é que tenha algo errado com o banco, ou a forma em que ele foi montado, então veja no link abaixo as imagens que demonstram minhas tabelas e sua estrutura: https://drive.google.com/drive/folders/1cujvAC1JhHDEL00UslQarCXV9L2hmiye?usp=sharing

Ainda, a classe onde a Query está sendo realziada:

@Repository
public class UserDAO implements UserDetailsService {

    @PersistenceContext
    private EntityManager manager;

    @Override
    public User loadUserByUsername(String email) {
        System.out.println();

        List <User> users = 
                manager.createQuery("select u from User u where email = :email", User.class)
                .setParameter("email", email).getResultList();

        if(users.isEmpty()) {
            throw new UsernameNotFoundException("Usuario " + email + "não foi encontrado no sistema");
        }
        System.out.println();
        return users.get(0);
    }
}

Tambem, segue o codigo das Entidades:

@Entity
public class User implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id
    private String email;
    private String name;
    private String password;


    @OneToMany(fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<>();

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.roles;
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return this.password;
    }

    @Override
    public String getUsername() {
        // TODO Auto-generated method stub
        return this.email;
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return true;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
}
@Entity
public class Role implements GrantedAuthority{

    private static final long serialVersionUID = 1L;

    @Id
    private String name;

    @Override
    public String getAuthority() {
        return this.name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Por favor, me ajudem. Estou aguarrado a dias neste ponto e não consigo resolver.

11 respostas

Acho que é porque você não passou o alias no atributo email, tente dessa forma:

select u from User u where u.email = :email

Opa Bruno obrigado pela contribuição. Então, tentei a principio com o alias mas também não funciona. Na atividade e no video, está referenciando sem o alias. Nao estou conseguindo entender o porque nao funciona.

Não da nenhuma exception? Ou será que vc só não está capturando-as?

Então, eu estou capturando para caso o retorno é vazio. Mas se caso estivesse errado, o código deveria estar crashando quando passa se nessa parte não?

Pode estar abafando a exception dentro de um try/catch por ex.

mas quando se usa uma exception é para que o fluxo continue com o tratamento, para que o codigo nao pare do nada certo? se estivesse com erro, nao seria tratado pois apenas tratei para retorno vazio, mas o codigo quebraria no ponto do erro, algo que nao acontece. Então, nao entedi bem como seria abar com a exception.

Outro detalhe, limpei o banco e as tabelas que deveria ser criadas, não foram. Como: User, Role e User_Role.

Para as outras tabelas foram criadas, normalmente. Seria alguma outra configuração a fazer? O Hibernate cria as tabelas com base nas entidades, conforme encontra as Anotations Entity, certo?

O hibernate cria, mas depende de uma configuração ("hibernate.auto", algo assim) no persistence.xml

Sobre a exception, a questão é que você poderia ter colocado um try/catch no código que chama o seu método de persistência (onde pode estar ocorrendo o erro), com isso, acaba suprimindo a mensagem caso não esteja propagando no catch

Então bruno, em minhas classes anotadas com @Entity representam uma tabela, que não está sendo criada para User e Role.

Sobre a exception, apliquei o try/catch como orientou, ai ele cai no catch mas como base no que eu for tratar certo? quero dizer, poderia colocar a exception (resposta) que quiser. O hibernate, nao me reporta nada se houve algum problema como, "olha a tabela nao existe", "nao conectei no banco" simplesmente o console é este:

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

Hibernate: select user0_.email as email1_3_, user0_.name as name2_3_, user0_.password as password3_3_ from User user0_ where user0_.email=?

obrigado bruno pela ajuda!

solução!

A solução foi que "user" é uma palavra reservada pelo postgree e minha entidade estava denominada de user. Desta forma, tive que renomear a entidade pois somente a anotation @table, não resolveu o meu problema.

Obrigado pela ajuda @Bruno!