2013-01-03 71 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