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?
Respostas:
No HQL, você deve usar o nome da classe java e o nome da propriedade do mapeado em
@Entity
vez do nome da tabela e da coluna reais, portanto, o HQL deve ser:Atualização: para ser mais preciso, você deve usar o nome da entidade configurado
@Entity
para 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.Entity
mas não@org.hibernate.annotations.Entity
)fonte
Por exemplo: o nome da sua classe de bean é UserDetails
Você não fornece o nome da sua tabela no banco de dados. você dá o nome da classe de bean .
fonte
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:
para
fonte
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:fonte
É possível que você tenha esquecido de adicionar o mapeamento da Entidade criada ao
hibernate.cfg.xml
mesmo erro.fonte
Isso indica que o hibernate não conhece a
User
entidade como "usuários".A
@Table
anotaçã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:
Veja minha resposta aqui para obter mais informações: Erro de tabela de hibernação não mapeada
fonte
Verifique também se a seguinte propriedade está definida na configuração do bean de hibernação:
Isso indica ao spring e hibernate onde encontrar suas classes de domínio anotadas como entidades.
fonte
Algumas instalações MySQL baseadas em Linux requerem distinção entre maiúsculas e minúsculas. Solução alternativa é aplicar
nativeQuery
.fonte
Eu também estava importando a entidade errada
import org.hibernate.annotations.Entity;
. Deve ser importadajavax.persistence.Entity;
fonte
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.
fonte
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:
Consulta após:
fonte
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:
Espero que ajude alguém
fonte
Eu recomendo este padrão:
fonte
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"
fonte
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;
fonte
com
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, você está tentando selecionar dausers
tabela. Mas você está anotando sua classe@Table( name = "Users" )
. Então, useusers
ouUsers
.fonte
Se você estiver usando a configuração xml, precisará de algo como o seguinte em um arquivo applicationContext.xml:
fonte