2013-01-03 107 views
0

我使用休眠從SQL Server 2008.while執行以下代碼休眠方言

Session session = sessionFactory.openSession(); 
String qry="select Form_Id,SUBSTRING( 
     (SELECT ('' + t2.Form_Layout_Txt) FROM Form_Layout_Info t2 
      WHERE t1.Form_Id = t2.Form_Id " + 
      " GROUP BY Form_Layout_Txt FOR XML path('')), 1,1000000000) 
      FROM Form_Layout_Info t1 GROUP BY Form_Id"; 

SQLQuery query = session.createSQLQuery(qry); 
recordList = query.list(); 

我Hibernate屬性訪問數據是

hibernate.connection.driver_class=com.microsoft.sqlserver.jdbc.SQLServerDriver 
hibernate.connection.url=jdbc:sqlserver://localhost:1433;databaseName=abc;integratedSecurity=false; 
hibernate.dialect=org.hibernate.dialect.SQLServerDialect 
hibernate.connection.username=sa 
hibernate.connection.password=p123asc 

我收到以下錯誤

No Dialect mapping for JDBC type: -9 

如何解決這個問題。

+0

空指針異常? – Lenymm

+0

不,它不是空指針異常 – user1321824

回答

2

您需要在配置中爲sql server提供hibernate.dialect=org.hibernate.dialect.SQLServerDialect

無論它提供在hibernate.cfg.xml爲:

<hibernate-configuration> 
    <session-factory name="session-factory"> 
     ..... 
     <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> 
     .... 
</session-factory> 
</hibernate-configuration> 

或屬性文件:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect 

我不知道你使用的是哪一種方式,所以貼我都知道。

,我發現您的問題here 2個解決方案:

  1. 試着改變你的驅動程序使用由微軟提供的MS SQL Server的JDBC驅動程序可能導致此問題而JTDS不給這樣的抱怨JTDS 。

  2. 您可能需要明確地將「addScalar」添加到您的hibernate查詢中。你可能有這樣的事情:

    sess.createSQLQuery(「SELECT * FROM CATS」); //嘗試更改爲: sess.createSQLQuery( 「SELECT * FROM CATS」) .addScalar( 「ID」,Hibernate.LONG) .addScalar( 「NAME」,Hibernate.STRING) .addScalar( 「BIRTHDATE」 ,Hibernate.DATE)

+0

其實我用hibernate.dialect = org.hibernate.dialect.SQLServer2008Dialect.Is是否正確? – user1321824

+0

我已發佈我的配置 – user1321824

+0

我可以在您的配置中看到正確的方言。你還在犯錯誤嗎? –

0

的錯誤意味着Hibernate不知道如何將JDBC類型「NVARCHAR」映射到Hibernate類型。

解決方法1:使用 addScalar這樣的:

Session session = sessionFactory.openSession(); 
String qry="select Form_Id,SUBSTRING( 
    (SELECT ('' + t2.Form_Layout_Txt) as formLayoutTxt FROM Form_Layout_Info t2 
     WHERE t1.Form_Id = t2.Form_Id " + 
     " GROUP BY Form_Layout_Txt FOR XML path('')), 1,1000000000) 
     FROM Form_Layout_Info t1 GROUP BY Form_Id"; 

SQLQuery query = session.createSQLQuery(qry).addScalar("formLayoutTxt", StringType.INSTANCE); 
recordList = query.list(); 

解決方案2:註冊Hibernate類型的方言

public class MySQLServerDialect extends SQLServerDialect { 

    public MySQLServerDialect() { 
    super(); 

    // Register mappings 
    registerHibernateType(Types.NVARCHAR, StringType.INSTANCE.getName()); 
    } 
} 

有關詳細信息,請this