我正在使用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
如何解决问题。
答案 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:
尝试将您的驱动程序更改为jTDS 使用ms sql server微软提供的jdbc驱动程序可能会导致此问题,而jTDS不会提出此问题。
您可能需要明确地将“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。