2011-10-23 47 views
1

我正在使用Hibernate來訪問我的Java應用程序的MySQL數據庫。我使用this instructions配置Hibernate。現在我想查詢我的數據庫;使用此代碼:使用Hibernate的MySQL:org.hibernate.exception.SQLGrammarException

java.util.List categList = null; 
SessionFactory sessionFacoryt ; 
sessionFacoryt = NewHibernateUtil.getSessionFactory(); 
org.hibernate.classic.Session hiberanateSession = sessionFacoryt.getCurrentSession(); 
String HQL = "select r from RssCategory r"; 
Transaction transaction = hiberanateSession.beginTransaction();     
org.hibernate.Query q = hiberanateSession.createQuery(HQL); 

// here is the Exception cause line 
categList = q.list(); 

正如您所見,因爲最後一行;我看到這個例外:

Oct 23, 2011 3:20:25 PM org.hibernate.util.JDBCExceptionReporter 
logExceptions WARNING: SQL Error: 1064, SQLState: 42000 Oct 23, 2011 
3:20:25 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use 
near '-IPTV-EPG.rss_category rsscategor0_' at line 1 
org.hibernate.exception.SQLGrammarException: could not execute query at 
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) at 
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
at org.hibernate.loader.Loader.doList(Loader.java:2223)  at 
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at 
org.hibernate.loader.Loader.list(Loader.java:2099) at 
org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:912) at 
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) at 
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at 
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at 
RSS.connectHtmlandleRSS.addTODB(connectHtmlandleRSS.java:206) at 
RSS.connectHtmlandleRSS.access$000(connectHtmlandleRSS.java:37)  at 
RSS.connectHtmlandleRSS$1.run(connectHtmlandleRSS.java:163) Caused by: 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an 
error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 
'-IPTV-EPG.rss_category rsscategor0_' at line 1  at 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at 
java.lang.reflect.Constructor.newInstance(Constructor.java:513) at 
com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at 
com.mysql.jdbc.Util.getInstance(Util.java:384) at 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) at 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) at 
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at 
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at 
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)  at 
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) at 
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275) at 
org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) at 
org.hibernate.loader.Loader.getResultSet(Loader.java:1787) at 
org.hibernate.loader.Loader.doQuery(Loader.java:674) at 
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at 
org.hibernate.loader.Loader.doList(Loader.java:2220) 

任何人都可以指導我這個例外的原因? 謝謝。

這裏是爲RssCategory生成的映射;這個類被生成到這個包sakila.entity。

<hibernate-mapping> 
    <class name="sakila.entity.RssCategory" table="rss_category" catalog="SAMIM-IPTV-EPG"> 
     <id name="catId" type="int"> 
      <column name="cat_id" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="catName" type="string"> 
      <column name="cat_name" length="45" not-null="true" unique="true" /> 
     </property> 
     <set name="rssNewses" inverse="true" table="rss_to_cat"> 
      <key> 
       <column name="cat_id" not-null="true" /> 
      </key> 
      <many-to-many entity-name="sakila.entity.RssNews"> 
       <column name="rss_id" not-null="true" /> 
      </many-to-many> 
     </set> 
    </class> </hibernate-mapping> 

這裏是rss_category生成的SQL代碼:

CREATE TABLE `rss_category` (
    `cat_id` int(11) NOT NULL, 
    `cat_name` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`cat_id`), 
    UNIQUE KEY `cat_name_UNIQUE` (`cat_name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

和Hibernate生成的HQL查詢:

Hibernate: select rsscategor0_.cat_id as cat1_4_, rsscategor0_.cat_name as cat2_4_ from SAMIM-IPTV-EPG.rss_category rsscategor0_ 
+0

請顯示生成的SQL查詢和RssCategory表的定義。你確定所有的專欄都在嗎? –

+0

這是爲rss_category表生成的SQL代碼。請在問題結尾處查看我的編輯。 – sajad

+0

是的,但是Hibernate爲您的HQL查詢生成的SQL查詢是什麼? –

回答

1

問題肯定是由目錄名稱中的破折號引起的。嘗試將目錄的名稱更改爲其他內容,而不使用破折號。

0

我,因爲我沒有使用過一些類似的問題正確的方言(MySQL Diallect)。請嘗試將hibernate.dialect配置爲org.hibernate.dialect.MySQL5Dialect。

+0

謝謝,但無效!我之前看過這個指令,但輸出沒有不同... – sajad

0

使用下面的HQL,

String HQL = "from RssCategory" 

如果你希望所有的列對象[](或項目的部分列表)的列表,請使用以下,

String HQL = "select r.prop1, r.prop2 ... from RssCategory r" 
+0

謝謝,我測試了你的命令,但結果是一樣的! – sajad

+1

@ManuPK:原始的HQL請求非常好。它甚至是一個正確的JPQL查詢,而你的第一個不是。你的第二個是無效的HQL。 –

+0

@JBNizet謝謝。你是對的,我已經修改了答案。 – ManuPK