Hibernate方言

时间:2013-01-03 11:33:13

标签: java hibernate

我正在使用Hibernate从sql server 2008访问数据。执行以下代码时

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 

如何解决问题。

3 个答案:

答案 0 :(得分: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

我不知道你使用的是哪种方式,所以发布我知道的。

我为您的问题找到了2个解决方案here

  1. 尝试将您的驱动程序更改为jTDS 使用ms sql server微软提供的jdbc驱动程序可能会导致此问题,而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)

答案 1 :(得分:1)

此问题与返回数据时完成的类型映射有关。并且Dialect中不存在该特定数据类型的映射。

https://forum.hibernate.org/viewtopic.php?f=1&t=959583

Hibernate数据类型 -

http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/type/StandardBasicTypes.html

答案 2 :(得分:0)

错误意味着hibernate不知道如何将JDBC类型“NVARCHAR”映射到休眠类型。

解决方案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:在方言中注册休眠类型

public class MySQLServerDialect extends SQLServerDialect {

  public MySQLServerDialect() {
    super();

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

有关详细信息,请查看this