休眠错误 - QuerySyntaxException:用户未映射 [来自用户]

Posted

技术标签:

【中文标题】休眠错误 - QuerySyntaxException:用户未映射 [来自用户]【英文标题】:Hibernate error - QuerySyntaxException: users is not mapped [from users] 【发布时间】:2012-04-14 19:46:57 【问题描述】:

我正在尝试从“用户”表中获取所有用户的列表,但出现以下错误:

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

知道为什么会出现此错误吗?

【问题讨论】:

相关:***.com/questions/14446048/… 【参考方案1】:

在 Spring 项目中: 我输入了错误的hibernate.packagesToScan=com.okan.springdemo.entity 并得到了这个错误。 现在它运行良好。

【讨论】:

【参考方案2】:

我在使用 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 
  // ...

【讨论】:

【参考方案3】:

如果您使用的是 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>

【讨论】:

【参考方案4】:

在HQL中,应该使用映射@Entityjava类名属性名而不是实际的表名和列名,所以HQL应该是:

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

更新:更准确地说,您应该使用@Entity中配置的实体名称来引用“表”,如果您不这样做,则默认为映射的java类的非限定名称明确设置。

(PS 是@javax.persistence.Entity,但不是@org.hibernate.annotations.Entity

【讨论】:

所以实际上这甚至是区分大小写的。所以“来自用户”会导致同样的异常 它是答案的一部分,但为了解决这个错误,我不得不像这样使用完整的对象路径:[...].createQuery("from gcv.metier.User as u where u .username= ?") 我也不得不使用整个路径,也许 JPA 对“用户”这个词有问题?我猜它是一些数据库实现中的保留字。事实上,这个问题只是在我将那个 db 表从 user 重命名为 the_user (修复另一个问题的一部分)之前出现在我身上。 您能否将 list() 更新为 getResultList(),因为前者已被弃用?【参考方案5】:

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

【讨论】:

【参考方案6】:

我推荐这种模式:

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

    // Column definitions here


【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我在使用休眠的 Spring 时遇到了同样的错误。我在 createQuery 语句中使用小写的“user”,而我的类是 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);

【讨论】:

【参考方案10】:

例如:你的 bean 类名是 UserDetails

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

你没有在 Db 上给出你的表名。 你给bean的类名

【讨论】:

【参考方案11】:

当我用 hibernate-core-5.2.12 替换旧的 hibernate-core 库时遇到了这个问题。但是我所有的配置都很好。我通过这种方式创建 sessionfactory 解决了这个问题:

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

    

希望对某人有所帮助

【讨论】:

【参考方案12】:

一些基于 Linux 的 MySQL 安装要求区分大小写。解决方法是申请nativeQuery

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

【讨论】:

你确定“基于 Linux 的 MySQL”在这里有作用吗?【参考方案13】:

还要确保在您的休眠 bean 配置中设置了以下属性:

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

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

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

添加@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;
    

【讨论】:

【参考方案16】:

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 table not mapped error

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

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

【讨论】:

我也忘记在hibernate.cfg.xml中添加POJO类了。【参考方案19】:

只是为了分享我的发现。即使查询的目标是正确的类名,我仍然遇到同样的错误。后来我意识到我从错误的包中导入了实体类。

在我更改导入行后问题解决了:

import org.hibernate.annotations.Entity;

import javax.persistence.Entity;

【讨论】:

现在这实际上救了我。

以上是关于休眠错误 - QuerySyntaxException:用户未映射 [来自用户]的主要内容,如果未能解决你的问题,请参考以下文章

如何消除android应用程序中的休眠错误?

选择值时出现休眠错误

休眠错误,如何解决?

休眠命名查询不知道错误

[休眠]错误:找不到实体类:

休眠 JPA 错误