2016-08-03 22 views
0

我目前正在開發一個JavaFX應用程序,並且我正在使用sqlite-jdbc-3.8.11.2連接器的SQLLite數據庫,加上我的ORM模型,我選擇了最新的Hibernate分配。我得到的問題是我無法執行由我寫的查詢,儘管我成功地從數據庫中設置了插入,讀取,更新和刪除操作,但如果不使用Hibernate的默認操作,我無法做到這一點。 這些都是在hibernate.cfg.xml文件我的配置設置:用於Hibernate的SQLLite方言,表未映射的錯誤

<!-- 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> 

正如你所看到的,我使用的是HSQL方言此數據庫,這是因爲我無法找到在一個SQLite方言包由Hibernate框架提供。然而,正如我之前所說,它以某種方式起作用。

所以我有一個名爲Program的類,它實際上是一個名爲Programs的數據庫中的表。這裏是程序在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); 
    } 

這是錯誤的Hibernate顯示:

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的字段,因此您可能期望列表中有單個結果:

Program p = session.createQuery("FROM Program p WHERE p.id=:id") 
     .setParameter("id", id) 
     .uniqueResult(); 
0

你應該修正的第一件事是方言。網絡中有不同的解決方案。我會嘗試這一個:

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

依賴包含org.hibernate.dialect.SQLiteDialect這看起來非常合理。但我沒有自己測試。 聽聽它是如何實現的會很有趣!