2016-08-03 4 views
0

私は現在JavaFXでアプリケーションを開発していますが、SQLiteデータベースをsqlite-jdbc-3.8.11.2コネクタと共に使用しています。ORMモデルには最新のHibernateを選択します分布。私が得ている問題は、データベースから挿入、読み込み、更新、削除をうまく管理しても、私が書いたクエリを実行できないということです。Hibernateからのデフォルト操作を使わずにはできません。 これらはhibernate.cfg.xmlファイルの私の設定です:あなたが見ることができるように、私はこのデータベースのHSQL方言を使用していSQLLite Dialect for Hibernate、テーブル未マッピングエラー

<!-- JDBC Database Connection Settings-->  
     <property name="connection.driver_class">org.sqlite.JDBC</property> 
     <property name="connection.url">jdbc:sqlite:database.db</property> 
     <!-- JDBC Connection Pool Settings--> 
     <property name="connection.pool_size">1</property> 
     <!-- Selecting SQL Dialect--> 
     <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> 
     <!-- Echo the SQL to stdout--> 
     <property name="show_sql">true</property> 
     <!-- Set the current session context --> 
     <property name="current_session_context_class">thread</property> 

私はsqliteの方言を見つけることができないので、これがありますパッケージはHibernateフレームワークによって提供されます。しかし、私が前に言ったように、それは何とか働く。

私はProgramという名前のクラスを持っています。実際には、Programというデータベース内のテーブルです。ここでは、Javaコードでプログラムの定義は次のとおりです。

public class Program { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "program_id") 
    protected int program_id; 

    @Column(name = "name") 
    protected String name; 
    @Column(name = "developer") 
    protected String developer; 
    @Column(name = "rating") 
    protected int rating; 
    @Column(name = "state") 
    protected int state; 
    @Column(name = "reservation_date") 
    protected String reservedDate; 
    @Column(name = "sent_date") 
    protected String sentDate; 

    public Program() { 
    } 

    public Program(String name, int state, LocalDate reservation_date) { 
     this.name = name; 
     this.state = state; 
     this.reservedDate = reservation_date.toString(); 
    } 

今、私は、データベース接続を管理するために使用DatabaseConnectorという名前の別のクラスを持っています。ここにそのコードはあります:

public class DatabaseConnector { 
    private final SessionFactory sessionFactory; 

    public DatabaseConnector() { 
     sessionFactory = new Configuration() 
       .configure() 
       .addAnnotatedClass(Program.class)//adding table 
       .buildSessionFactory(); 
    } 

    public Program getProgram(int id) { 
     Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     Program p = session.get(Program.class, id);//captures an object from the database 
     session.getTransaction().commit(); 
     return program; 
    } 

上記のとおり、完全に動作するgetProgram()メソッドがあります。

私はHibernateのドキュメントに基づいて、自分自身のクエリを実行しようとすると、しかし、それはこの方法でなければなりません:

public Program getProgram(int id) { 
     Session session = sessionFactory.getCurrentSession(); 
     session.beginTransaction(); 
     List<Program> p = session.createQuery("FROM Programs WHERE Programs.id="+id).list();//This should find an Program 
     session.getTransaction().commit(); 
     return p.get(0); 
    } 

これは、エラーがショーを休止状態です。

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Programs is not mapped [FROM Programs WHERE Programs.id=1] 

私がしなければなりませんこのエラーはSELECT操作で発生するのではなく、自分の個人的なクエリで実行しようとするすべての操作であると言います。私はこの間違いがデータベースの方言と関連していると信じていますが、私はあまりよく分かりません。

答えて

0

私はこれが方言に関連していると信じる理由はありません。あなたのHQLは正しくありません。あなたのクエリがあるべき

"FROM Program p WHERE p.id="+id 

Program、クラス名ではなく、Programs、テーブル名に注意してください。)

まだよく、クエリで使用するパラメータ:

List<Program> p = session.createQuery("FROM Program p WHERE p.id=:id") 
     .setParameter("id", id) 
     .list(); 

または、以来、あなたのフィールドがidと選択されている場合、おそらくリスト内の単一の結果を期待しているでしょう:

0

まず修正すべきは方言です。ウェブにはさまざまな解決策があります。私はこの1つをしようとするだろう:

<dependency> 
    <groupId>net.kemitix</groupId> 
    <artifactId>sqlite-dialect</artifactId> 
    <version>0.1.0</version> 
</dependency> 

depedencyは非常に合理的に見えるorg.hibernate.dialect.SQLiteDialectが含まれています。しかし、私はそれを自分でテストしなかった。 それがうまくいくか聞いても面白いですね!

関連する問題