1

我正在使用 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.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 

如何解决问题。

4

3 回答 3

2

您需要hibernate.dialect=org.hibernate.dialect.SQLServerDialect为 sql server 提供配置。

在 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 个解决方案:

  1. 尝试使用微软提供的 ms sql server jdbc 驱动程序将您的驱动程序更改为 jTDS 可能会导致此问题,而 jTDS 不会给出此投诉。

  2. 您可能需要明确地“addScalar”到您的休眠查询。你可能有这样的事情:

    sess.createSQLQuery("SELECT * FROM CATS"); // 尝试更改为: sess.createSQLQuery("SELECT * FROM CATS") .addScalar("ID", Hibernate.LONG) .addScalar("NAME", Hibernate.STRING) .addScalar("BIRTHDATE", Hibernate.DATE)

于 2013-01-03T11:38:02.203 回答
1

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

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

休眠数据类型 -

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

于 2013-01-03T12:54:27.443 回答
0

该错误意味着休眠不知道如何将 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:在方言中注册Hibernate类型

public class MySQLServerDialect extends SQLServerDialect {

  public MySQLServerDialect() {
    super();

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

有关更多详细信息,请查看

于 2014-09-11T02:35:40.293 回答