Erro de hibernação - QuerySyntaxException: users não está mapeado [dos usuários]

126

Estou tentando obter uma lista de todos os usuários da tabela "users" e recebo o seguinte erro:

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)

Este é o código que escrevi para adicionar / obter usuários:

public List<User> getUsers() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    List<User> result = (List<User>) session.createQuery("from users").list();
    session.getTransaction().commit();
    return result;
}

public void addUser(User user) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
}

public void addUser(List<User> users) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    for (User user : users) {
        session.save(user);
    }
    session.getTransaction().commit();
}

Adicionar usuários funciona, mas quando uso a função getUsers, recebo esses erros.

Este é o meu arquivo de configuração de hibernação:

<hibernate-configuration>
<session-factory>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.default_schema">test</property>
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

    <property name="show_sql">true</property>

    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">create-drop</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <property name="current_session_context_class">thread</property>

    <!-- Mapping files will go here.... -->

    <mapping class="model.Company" />
    <mapping class="model.Conference" />
    <mapping class="model.ConferencesParticipants" />
    <mapping class="model.ConferenceParticipantStatus" />
    <mapping class="model.ConferencesUsers" />
    <mapping class="model.Location" />
    <mapping class="model.User" />

</session-factory>

e esta é minha classe de usuário:

@Entity
@Table( name = "Users" )
public class User implements Serializable{

    private long userID;
    private int pasportID;
    private Company company; 
    private String name;
    private String email;
    private String phone1;
    private String phone2;
    private String password; //may be null/empty , will be kept hashed
    private boolean isAdmin;
    private Date lastLogin;

    User() {} //not public on purpose!

    public User(int countryID, Company company, String name, String email,
            String phone1, String phone2, String password, boolean isAdmin) {
        this.pasportID = countryID;
        this.company = company;
        this.name = name;
        this.email = email;
        this.phone1 = phone1;
        this.phone2 = phone2;
        this.password = password;
        this.isAdmin = isAdmin;
    }

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    public long getUserID() {
        return userID;
    }
    public void setUserID(long userID) {
        this.userID = userID;
    }
    ...    
}

Alguma idéia de por que recebo esse erro?

Azul
fonte

Respostas:

297

No HQL, você deve usar o nome da classe java e o nome da propriedade do mapeado em @Entityvez do nome da tabela e da coluna reais, portanto, o HQL deve ser:

List<User> result = session.createQuery("from User", User.class).getResultList();

Atualização: para ser mais preciso, você deve usar o nome da entidade configurado @Entitypara se referir à "tabela", cujo padrão é o nome não qualificado da classe java mapeada, se você não a definir explicitamente.

(PS é @javax.persistence.Entitymas não @org.hibernate.annotations.Entity)

Ken Chan
fonte
10
Então, na verdade, isso diferencia maiúsculas de minúsculas. tão "de usuário" resultaria na mesma exceção
Tobi
3
É parte da resposta, mas, para resolver o erro, tive que usar o caminho completo do objeto como este: [...]. CreateQuery ("from gcv.metier.User como u onde u.username =?")
Raphael
Eu também tive que usar o caminho inteiro, talvez o JPA tenha um problema com a palavra "Usuário"? Eu acho que é uma palavra reservada em algumas implementações de banco de dados. De fato, esse problema surgiu de mim quando renomeei a tabela db de usuário para the_user (parte da correção de outro problema) antes que o JPA estivesse correto .
Michael Coxon
1
você pode pls atualizar list () para getResultList () porque o primeiro está obsoleto?
Durja Arai
31

Por exemplo: o nome da sua classe de bean é UserDetails

Query query = entityManager. createQuery("Select UserName from **UserDetails** "); 

Você não fornece o nome da sua tabela no banco de dados. você dá o nome da classe de bean .

Kumaresan Perumal
fonte
12

Apenas para compartilhar minha descoberta. Ainda recebi o mesmo erro, mesmo que a consulta visasse o nome de classe correto. Mais tarde, percebi que estava importando a classe Entity do pacote errado.

O problema foi resolvido depois de alterar a linha de importação de:

import org.hibernate.annotations.Entity;

para

import javax.persistence.Entity;
Iwan Satria
fonte
Agora isso me salvou, na verdade.
Anirudh
9

Adicionada @TABLE(name = "TABLE_NAME")anotação e corrigida. Verifique suas anotações e o arquivo hibernate.cfg.xml. Este é o arquivo de entidade de amostra que funciona:

import javax.persistence.*;

@Entity
@Table(name = "VENDOR")
public class Vendor {

    //~ --- [INSTANCE FIELDS] ------------------------------------------------------------------------------------------
    private int    id;
    private String name;

    //~ --- [METHODS] --------------------------------------------------------------------------------------------------
    @Override
    public boolean equals(final Object o) {    
        if (this == o) {
            return true;
        }

        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final Vendor vendor = (Vendor) o;

        if (id != vendor.id) {
            return false;
        }

        if (name != null ? !name.equals(vendor.name) : vendor.name != null) {
            return false;
        }

        return true;
    }

    //~ ----------------------------------------------------------------------------------------------------------------
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public int getId() {
        return id;
    }

    @Basic
    @Column(name = "NAME")
    public String getName() {

        return name;
    }

    public void setId(final int id) {
        this.id = id;
    }

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

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}
Fırat KÜÇÜK
fonte
8

É possível que você tenha esquecido de adicionar o mapeamento da Entidade criada ao hibernate.cfg.xmlmesmo erro.

Augustas
fonte
Também esqueci de adicionar a classe POJO no hibernate.cfg.xml.
Chinmoy 27/02
6

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]

Isso indica que o hibernate não conhece a Userentidade como "usuários".

@javax.persistence.Entity
@javax.persistence.Table(name = "Users")
public class User {

A @Tableanotação define o nome da tabela como "Usuários", mas o nome da entidade ainda é referido no HQL como "Usuário".

Para alterar os dois, você deve definir o nome da entidade:

// this sets the name of the table and the name of the entity
@javax.persistence.Entity(name = "Users")
public class User implements Serializable{

Veja minha resposta aqui para obter mais informações: Erro de tabela de hibernação não mapeada

cinzento
fonte
5

Verifique também se a seguinte propriedade está definida na configuração do bean de hibernação:

<property name="packagesToScan" value="yourpackage" />

Isso indica ao spring e hibernate onde encontrar suas classes de domínio anotadas como entidades.

jrreid
fonte
5

Algumas instalações MySQL baseadas em Linux requerem distinção entre maiúsculas e minúsculas. Solução alternativa é aplicar nativeQuery.

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
Rajkumar
fonte
1
você tem certeza de que o "MySQL baseado em Linux" tem um papel aqui?
ASGs
3

Eu também estava importando a entidade errada import org.hibernate.annotations.Entity; . Deve ser importadajavax.persistence.Entity;

Ratheesh K
fonte
3

Verifique também se você adicionou a classe anotada usando:

new Configuration().configure("configuration file path").addAnnotatedClass(User.class)

Isso sempre desperdiçava meu tempo ao adicionar uma nova tabela no banco de dados usando o Hibernate.

Gherbi Hicham
fonte
2

Eu estava recebendo o mesmo erro enquanto o Spring com hibernação createQuery.. Eu estava usando "user" em minúsculas na minha instrução e minha classe era User..Então alterei para User na minha consulta e o problema foi resolvido.

Consulta antes:

Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);

Consulta após:

Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);
Himanshu Shukla
fonte
1

Eu entendi esse problema quando substituí a biblioteca hibernate-core antiga por hibernate-core-5.2.12. No entanto, toda a minha configuração estava ok. E eu corrigi esse problema criando o sessionfactory desta maneira:

private static SessionFactory buildsSessionFactory() {
    try {
        if (sessionFactory == null) {
            StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
                    .configure("/hibernate.cfg.xml").build();
            Metadata metaData = new MetadataSources(standardRegistry)
                    .getMetadataBuilder().build();
            sessionFactory = metaData.getSessionFactoryBuilder().build();
        }
        return sessionFactory;
    } catch (Throwable th) {

        System.err.println("Enitial SessionFactory creation failed" + th);

        throw new ExceptionInInitializerError(th);

    }
}

Espero que ajude alguém

Lakhan Sharma
fonte
1

Eu recomendo este padrão:

@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {    
    static final String PERSISTANCE_NAME = "USER";

    // Column definitions here

}
Jonas Gröger
fonte
0

Na sua consulta, você deve usar o nome da classe (usuário) e não o nome da tabela (usuários), para que sua consulta seja "do usuário"

sami gharbi
fonte
0

Você deve digitar o mesmo nome na sua consulta de seleção que sua entidade ou classe (diferencia maiúsculas de minúsculas). ou seja, selecione o usuário em className / nome da entidade user;

Vipul Thakur
fonte
0

com org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], você está tentando selecionar da userstabela. Mas você está anotando sua classe @Table( name = "Users" ). Então, use usersou Users.

zak zak
fonte
0

Se você estiver usando a configuração xml, precisará de algo como o seguinte em um arquivo applicationContext.xml:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
<property name="dataSource">
  <ref bean="dataSource" />
</property>
<property name="annotatedClasses">
  <list>
    <value>org.browsexml.timesheetjob.model.PositionCode</value>
  </list>
Geoffrey Ritchey
fonte