2016-08-06 18 views
0

私は、SQLite(ドライバ:Xerial 3.11.8.2)とMavenでHibernate 5.2.1.Finalを使用してアプリケーションを開発しています。問題は、Hibernateが@Entity(javax.persistence.Entity)アノテーションで提供されているエンティティにある名前付きクエリを見つけることができないことです。私はこれまでのところソリューションを探していましたが、Hibernate APIを使用してその名前に対してクエリが定義されていません

私は最近、JPAを使用する代わりにHibernate APIに切り替えました。以前は問題はなく、この名前付きのクエリを変更していませんでした。まだのjavax.persistence注釈を使用

例外私は取得しています:。

Caused by: java.lang.IllegalArgumentException: No query defined for that name [SugerowanaPozycja.getByCategory] 
    at org.hibernate.internal.AbstractSharedSessionContract.getNamedQuery(AbstractSharedSessionContract.java:546) 
    at org.hibernate.internal.AbstractSharedSessionContract.getNamedQuery(AbstractSharedSessionContract.java:101) 
    at pl.nombritech.Menual.dao.SugerowanaPozycjaDAO.getByKategoria(SugerowanaPozycjaDAO.java:90) 
    at pl.nombritech.Menual.view.GlowneOknoController.uzupelnijSugerowanePozycje(GlowneOknoController.java:227) 
    at pl.nombritech.Menual.view.GlowneOknoController.initialize(GlowneOknoController.java:210) 
    ... 22 more 

注釈私のエンティティクラスに:

import javax.persistence.Entity; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 

    @Entity 
    @NamedQueries({ 
    @NamedQuery(name = "SugerowanaPozycja.getByCategory", 
    query = "SELECT e FROM SugerowanaPozycja e WHERE e.kategoria = :kategoria") 
    }) 

と例外が発生したところ、それは次のようになります。

public static ObservableList<SugerowanaPozycja> getByKategoria(String kategoria) 
{ 
    Session session = Main.SESSION_FACTORY.openSession(); 

    Transaction transaction = session.beginTransaction(); 

    Query<SugerowanaPozycja> query = session.getNamedQuery("SugerowanaPozycja.getByCategory"); // exception here 
    query.setParameter("kategoria", kategoria); 
    ObservableList<SugerowanaPozycja> list = FXCollections.observableArrayList(query.getResultList()); 

    transaction.commit(); 

    session.close(); 

    return list; 
} 

私はhibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">org.sqlite.JDBC</property> 
     <property name="hibernate.connection.url">jdbc:sqlite:menual_data/bazadb.db</property> 
     <property name="hibernate.connection.username"></property> 
     <property name="hibernate.connection.password"></property> 
     <property name="hibernate.dialect">pl.nombritech.Menual.util.SQLiteDialect</property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <property name="hbm2ddl.auto">create</property> 
     <property name="hibernate.c3p0.min_size">1</property> 
     <property name="hibernate.c3p0.max_size">1</property> 
    </session-factory> 
</hibernate-configuration> 

そして最後に、私は休止状態に初期化する方法:

public static SessionFactory SESSION_FACTORY; 

Configuration configuration = new Configuration().configure(Main.class.getResource("/hibernate.cfg.xml")); 
StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder(); 
serviceRegistryBuilder.applySettings(configuration.getProperties()); 
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); 
SESSION_FACTORY = configuration.buildSessionFactory(serviceRegistry); 

私はこの問題のヒントについて非常に感謝しています。私はここにそのようなスレッドがたくさんあることを知っていますが、それは私の場合には役に立たなかった。

+2

*私は最近、JPAを使用せずにHibernate APIに切り替えました。*あなたはそれをしてはいけません。しかし、とにかく、あなたのクラスは構成ファイルにエンティティとしてリストされていません。 ''要素が必要です。 http://docs.jboss.org/hibernate/orm/5.2/quickstart/html_single/#tutorial_annotationsを読んで、例を含むzipファイルをダウンロードしてください。 –

+0

純粋なHibernateがJPAよりも多くの可能性を提供していて、私が想定しているJPAを使用する唯一の利点であるため、Hibernateに固執して他のプロバイダに切り替えるつもりはありません。私は、Hibernateが@Entityアノテーションを持つものを見つけるためにクラスをスキャンすることができると考えました... – Bloodlex

答えて

2

クエリが存在するクラスのマッピングは、hibernate.cfg.xmlに存在する必要があります。このケースでは、それが存在しないので、あなたはこの例外を取得しています。

hibernate.cfg.xmlの内側に次のタグを配置し、この問題を解決するために:

<mapping class="your.package.ClassName"/> 

して、プログラムを再実行します。

+0

ありがとうございました:) – Bloodlex

関連する問題