Hibernateエラー-QuerySyntaxException:ユーザーがマッピングされていません[ユーザーから]


126

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

このエラーが発生する理由は何ですか?


回答:


297

HQLでは、実際のテーブル名と列名の代わりに、マップされたJavaクラス名プロパティ名を使用する@Entity必要があるため、HQLは次のようになります。

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

更新:より正確@Entityに言うと、で構成されたエンティティ名を使用して「テーブル」を参照する必要があります。明示的に設定しない場合、デフォルトでマップされたJavaクラスの非修飾名になります。

(PSそれはそうではあり@javax.persistence.Entityません@org.hibernate.annotations.Entity


10
つまり、実際には大文字と小文字が区別されます。したがって、「ユーザーから」の場合も同じ例外が発生します
tObi

3
これは答えの一部ですが、エラーを解決するには、次のような完全なオブジェクトパスを使用する必要がありました。[...]。createQuery( "from gcv.metier.User as u where u.username =?")
Raphael

また、パス全体を使用する必要がありました。おそらくJPAには「ユーザー」という単語に問題がありますか?いくつかのDB実装では予約語になっていると思います。実際、この問題は、JPAが問題なく機能する前に、dbテーブルの名前をuserからthe_user(別の問題の修正の一部)に変更したときにのみ発生しました。
マイケルコクソン2018年

1
前者は非推奨なので、list()をgetResultList()に更新できますか?
Durja Arai

31

例:Beanクラス名はUserDetailsです

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

Dbにはテーブル名を付けません。Beanのクラス名を指定します


12

私の発見を共有するためだけに。クエリが正しいクラス名を対象としても、同じエラーが発生しました。後で、間違ったパッケージからEntityクラスをインポートしていることに気付きました。

インポート行を次のように変更した後、問題は解決しました:

import org.hibernate.annotations.Entity;

import javax.persistence.Entity;

今、これは実際に私を救った。
Anirudh

9

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

8

hibernate.cfg.xml同じエラーで、作成したエンティティのマッピングをに追加し忘れた可能性があります。


私もhibernate.cfg.xmlにPOJOクラスを追加するのを忘れていました。
チンモイ2018

6

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注釈は、設定テーブル「ユーザー」が、エンティティ名がまだ「ユーザー」として、HQLで呼ばれるように名前を。

両方を変更するには、エンティティの名前を設定する必要があります。

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

詳細については、ここで私の回答を参照してください:Hibernateテーブルがマップされていないエラー


5

また、Hibernate Bean構成で次のプロパティが設定されていることを確認してください。

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

これは、エンティティとして注釈が付けられたドメインクラスの場所をSpringおよびHibernateに通知します。


5

一部のLinuxベースのMySQLインストールでは、大文字と小文字を区別する必要があります。回避策は、適用することnativeQueryです。

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

1
ここで「LinuxベースのMySQL」が役割を果たしていることを確認しますか?
asgs 2017年

3

間違ったエンティティもインポートしていましたインポートするimport org.hibernate.annotations.Entity; 必要がありますjavax.persistence.Entity;


3

また、以下を使用して、注釈付きクラスを追加したことを確認してください。

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

Hibernateを使用してデータベースに新しいテーブルを追加するとき、それはいつも私の時間を無駄にしました。


2

Springでhibernateを使用しているときに同じエラーが発生しました。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);

1

古いhibernate-coreライブラリをhibernate-core-5.2.12に置き換えると、この問題が発生しました。しかし、私の設定はすべて大丈夫でした。そして、私はこのようにセッションファクトリーを作成することでこの問題を修正しました:

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

    }
}

それが誰かを助けることを願って


1

私はこのパターンをお勧めします:

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

    // Column definitions here

}

0

クエリでは、テーブル名(ユーザー)ではなくクラス名(ユーザー)を使用する必要があるため、クエリは「ユーザーから」です


0

エンティティまたはクラス(大文字と小文字を区別)と同じ名前を選択クエリに入力する必要があります。つまり、className / Entity Nameユーザーからユーザーを選択します。


0

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]usersテーブルから選択しようとしています。ただし、クラスにで注釈を付けています@Table( name = "Users" )。だからどちらかを使うusers、またはをUsers


0

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.