79

Hibernateを使用してデータベース上でCRUD操作を行うWebアプリケーションがあります。テーブルがマップされていないというエラーが表示されました。Javaファイルを参照してください。

エラーメッセージ:

org.springframework.orm.hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
...
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
...

これが私のDAO.java方法です:

public int getTotalBooks(){
    return DataAccessUtils.intResult(hibernateTemplate.find(
          "SELECT COUNT(*) FROM Books"));
}

Book.java

@Entity
@Table(name="Books")
public class Book {

    @Id
    @GeneratedValue
    @Column(name="id")
    private int id;

    @Column(name="title", nullable=false)
    private String title;
    ...
}

動作させるにはどのように変更すればよいですか?

4

9 に答える 9

147

例外メッセージには次のように書かれています。

Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]

Booksマップされていません。つまり、と呼ばれるマップされたタイプはありませんBooks

そして確かに、ありません。マップされたタイプはと呼ばれBookます。と呼ばれるテーブルにマップされますBooksが、タイプはと呼ばれBookます。HQL(またはJPQL)クエリを作成するときは、テーブルではなくタイプの名前を使用します。

したがって、クエリを次のように変更します。

select count(*) from Book

私はそれが必要かもしれないと思いますが

select count(b) from Book b

HQLが表記をサポートしていない場合*

于 2013-01-21T20:34:45.777 に答える
23

hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books];

Hibernateは、「Books」という名前のエンティティを知らないと言おうとしています。あなたのエンティティを見てみましょう:

@javax.persistence.Entity
@javax.persistence.Table(name = "Books")
public class Book {

右。のテーブル名はBook「Books」に名前が変更されましたが、エンティティ名はクラス名から「Book」のままです。エンティティ名を設定する場合は、@Entity代わりに注釈の名前を使用する必要があります。

// this allows you to use the entity Books in HQL queries
@javax.persistence.Entity(name = "Books")
public class Book {

これにより、エンティティ名とテーブル名の両方が設定されます。


Person.hbm.xmlファイルからJavaアノテーションを使用して休止状態のフィールドを記述するように移行しているときに、逆の問題が発生しました。私の古いXMLファイルには次のものがありました。

<hibernate-mapping package="...">
    <class name="Person" table="persons" lazy="true">
       ...
</hibernate-mapping>

そして、私の新しいエンティティ@Entity(name=...)には、テーブルの名前を設定するために必要なものがありました。

// this renames the entity and sets the table name
@javax.persistence.Entity(name = "persons")
public class Person {
    ...

そのとき私が見たのは、次のようなHQLエラーでした。

QuerySyntaxException: Person is not mapped
     [SELECT id FROM Person WHERE id in (:ids)]

これに伴う問題は、エンティティ名も名前が変更されpersonsていたことです。次を使用してテーブル名を設定する必要があります。

// no name = here so the entity can be used as Person
@javax.persistence.Entity
// table name specified here
@javax.persistence.Table(name = "persons")
public class Person extends BaseGeneratedId {
于 2016-07-20T15:28:39.103 に答える
14

この回答は遅れていますが、「テーブルがマップされていない」例外に関連する概念を要約しています(休止状態の初心者に非常に一般的であるため、この問題に遭遇した人を支援するため)。このエラーは多くの理由で発生する可能性がありますが、目標は、多くの初心者の休止状態の開発者が直面する最も一般的なエラーに対処して、研究時間を節約することです。以下の簡単なデモンストレーションに、私自身の例を使用しています。

例外:

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

簡単に言うと、このごく普通の例外は、以下のコードでクエリが間違っていることを示しているだけです。

Session session = this.sessionFactory.getCurrentSession();
List<Subscriber> personsList = session.createQuery(" from subscriber").list();

これが私のPOJOクラスの宣言方法です。

@Entity
@Table(name = "subscriber")
public class Subscriber

ただし、 「サブスクライバーから」のクエリ構文は正しく、テーブルsubscriberは存在します。それは私に重要なポイントをもたらします:

  • これはSQLではなくHQLクエリです。

そしてそれがここでどのように説明されたか

HQLは、データベースのテーブルと列ではなく、永続オブジェクトとそのプロパティで機能します。

上記のクエリはHQLクエリであるためsubscriber、テーブル名ではなくエンティティ名であると想定されます。テーブルsubscriber がエンティティにマップされているのでSubscriber。コードを次のように変更すると、問題は解決します。

Session session = this.sessionFactory.getCurrentSession();
List<Subscriber> personsList = session.createQuery(" from Subscriber").list();

混乱しないようにするためだけに。多くの場合、HQLでは大文字と小文字が区別されることに注意してください。そうでなければ、私の場合はうまくいったでしょう。

SELECT、FROM、WHEREなどのキーワードでは大文字と小文字は区別されませんが、HQLではテーブル名や列名などのプロパティで大文字と小文字が区別されます。

https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

Hibernateマッピングがどのように機能するかをさらに理解するには、こちらをお読みください

于 2017-04-04T16:45:49.487 に答える
3

みんなありがとう。良いアイデアがたくさん。これはSpringとHibernateでの私の最初のアプリケーションです。私のような「初心者」を扱うときはもう少し忍耐力があります。

TomAndersonとRomanC.の回答をお読みください。彼らは問題を非常によく説明しました。そして、あなた方全員が私を助けてくれました。

SELECT COUNT(*) FROM Books

select count(book.id) from Book book

そしてもちろん、私はこの春の設定を持っています:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="packagesToScan" value="extjs.model"/>

本当にありがとうございました!

于 2013-01-21T21:04:57.180 に答える
3

エンティティアノテーションとテーブルアノテーションがあることを確認し、テーブルアノテーションにテーブル名を設定します。

@Entity
@Table(name = "table_name")
public class TableName {

}
于 2020-04-13T09:12:58.887 に答える
2

受け入れられた回答に加えて、もう1つのチェックは、セッションファクトリのセットアップ中にsessionFactory.setPackagesToScan(...)でエンティティパッケージへの正しい参照があることを確認することです。

于 2019-05-12T00:09:59.087 に答える
1

構成されたがこのプロパティを置くSpring構成のタイプapplicationContext.xmlミスsessionFactory

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="packagesToScan" value="${package.name}"/>
于 2013-01-21T20:29:58.787 に答える
0

Hibernateは、キャピタライゼーションについても気が利いています。デフォルトでは、最初の文字が大文字のクラス名になります。したがって、クラスが呼び出された場合FooBarは、を渡さないでください"foobar""FooBar"それが機能するためには、その正確な大文字で渡す必要があります。

于 2018-04-16T14:20:44.307 に答える
0

私は同じ問題を抱えていましたが、代わりに@Entityレコードを取得するために次のコードを使用しました

    List<Map<String, Object>> list = null;
            list = incidentHibernateTemplate.execute(new HibernateCallback<List<Map<String, Object>>>() {

            @Override
            public List<Map<String, Object>> doInHibernate(Session session) throws HibernateException {
                Query query = session.createSQLQuery("SELECT * from table where appcode = :app");
                    query.setParameter("app", apptype);
                query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                return query.list();

                }
            });

更新には次のコードを使用しました

private @Autowired HibernateTemplate incidentHibernateTemplate;
Integer updateCount = 0;

    updateCount = incidentHibernateTemplate.execute((Session session) -> {
        Query<?> query = session
                    .createSQLQuery("UPDATE  tablename SET key = :apiurl, data_mode = :mode WHERE apiname= :api ");
          query.setParameter("apiurl", url);
          query.setParameter("api", api);
          query.setParameter("mode", mode);
            return query.executeUpdate();
        }
    );
于 2020-10-19T09:40:53.767 に答える