Hibernate 错误-QuerySyntaxException: user is not map [ from users ]

我试图从“ users”表中获取所有用户的列表,结果得到如下错误:

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)

这是我为添加/获取用户而编写的代码:

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();
}

添加用户可以工作,但是当我使用 getUsers 函数时会得到这些错误。

这是我的休眠配置文件:

<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>

这是我的用户类:

@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;
}
...
}

知道为什么我会得到这个错误吗?

309019 次浏览

在 HQL 中,应该使用映射的 @EntityJava 类名属性名称,而不是实际的表名和列名,因此 HQL 应该是:

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

更新: 更准确地说,您应该使用在 @Entity中配置的实体名称来引用“表”,如果您没有显式地设置它,则默认为映射的 Java 类的未限定名称。

(附注,是 @javax.persistence.Entity而不是 @org.hibernate.annotations.Entity)

分享我的发现。即使查询的目标是正确的类名,我仍然得到相同的错误。后来我意识到我从错误的包中导入了 Entity 类。

当我把进口线改成:

import org.hibernate.annotations.Entity;

import javax.persistence.Entity;

增加了 @TABLE(name = "TABLE_NAME")注释和修复。请检查您的注释和 hibernate.cfg.xml 文件:

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;
}
}

有可能您忘记将已创建的 Entity 映射添加到 hibernate.cfg.xml,同样的错误。

例如: bean 类的名称是 用户详情

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

在 DB.给出 bean 的类名上不给出表名。

我还导入了错误的实体 import org.hibernate.annotations.Entity; 它应该是导入 javax.persistence.Entity;

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

这表明 hibernate 不知道 User实体是“用户”。

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

@Table注释将 桌子名称设置为“ Users”,但实体名称在 HQL 中仍称为“ User”。

若要同时更改两者,应设置实体的名称:

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

更多信息请参见我的答案: Hibernate 表未映射错误

还要检查您是否使用以下方法添加了带注释的类:

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

在使用 Hibernate 在数据库中添加新表时,这总是浪费我的时间。

还要确保在 hibernate bean 配置中设置了以下属性:

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

这告诉 spring 和 hibernate 在哪里可以找到注释为实体的域类。

一些基于 Linux 的 MySQL 安装需要区分大小写。

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)

当我用 hibernate-core-5.2.12替换旧的 hibernate-core 库时,我遇到了这个问题。然而,我的所有配置是好的。我通过创建会话工厂解决了这个问题:

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);


}
}

希望能帮到别人

当 Spring 进入冬眠状态时,我得到了同样的错误。.我在 createQuery语句中使用小写的“ User”,我的类是 User。.所以在我的查询中把它改为用户,问题就解决了。

之前的问题:

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

后面的问题:

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

在查询中,必须使用类名(User)而不是表名(users) 所以你的问题是 “来自用户”

必须在选择查询中键入与实体或类(区分大小写)相同的名称。即从 className/Entity Name 用户中选择用户;

我推荐这种模式:

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


// Column definitions here


}

使用 org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users],您将尝试从 users表中进行选择。但是你正在用 @Table( name = "Users" )注释你的类。所以要么使用 users,要么使用 Users

如果使用的是 xml 配置,那么在 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>

我在使用 Quarkus 微服务框架时也遇到了这个问题:

public class SomeResource {


@GET
@RolesAllowed({"basic"})
public Response doSomething(@Context SecurityContext context) {
// ...
}
}


// this will generate an QuerySyntax exception, as the authorization module
// will ignore the Entity annotation and use the class name instead.
@Entity(name = "users")
@UserDefinition
public class User {
// ...
}


// do this instead
@Entity
@Table(name = "users")
@UserDefinition
public class User {
// ...
}

在 Spring 项目中: 我键入了错误的 hibernate.packagesToScan=com.okan.springdemo.entity,得到了这个错误。 现在效果不错。

假设,你的 Java ClassnameUser,你的 database table nameusers。 所以你用 @Table(name = "users")来注释这个类,好的,没问题。 现在在您的查询中,您不要像 SELECT .... FROM users那样写(不要写表名)。您将编写 SELECT .... FROM User(编写类名)。

问题解决了!