четверг, 20 октября 2016 г.

org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

При работе через Hibernate с MS SQL сервером 2008 и использовании стандартного майкрасовствого драйвера com.microsoft.sqlserver.jdbc.SQLServerDriver  при вызове нативного скрипта все валится с ошибкой . В заметке приведено решение проблемы.

Через ArcGIS была создана табличка table в базе MS SQL 2008 в ней присутствуют текстовые поля. Сам ArcGIS автоматом создал поля с типом nvarchar(256).
Вот скрипт таблицы:

CREATE TABLE [dbo].[table](
 [NAME] [nvarchar](256) NULL,
 [X] [numeric](38, 8) NULL,
 [Y] [numeric](38, 8) NULL
) ON [PRIMARY]

При выборе данных из такой таблички запросом

select * from db.dbo.table

Hibernate выдавал ошибку

org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

Настоечный файл hiberhate.cfg.xml имеет вид

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory name="sf">
  
  <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
  <property name="connection.url">jdbc:sqlserver://XXX.XXX.XXX.XXX:1433;databaseName=db</property>
  <property name="connection.username">user</property>
  <property name="connection.password">pass</property>
  <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>

  <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
  <property name="show_sql">true</property>
  <property name="connection.pool_size">10</property>

 </session-factory>
</hibernate-configuration>


т.е. в моем случае использовался стандартный драйвер от майкрасовта.

Посмотрев на ошибку и скрипт таблички понял что ошибка скорее всего в использовании типа nvarchar(256), т.к. сам всегда использую для таких текстовых полей varchar(256).

Решение проблемы было использовать приведение типов запросе.
Вот такой запрос отрабатывает нормально

select cast(t.name as varchar(256)) name,t.x,t.y from db.dbo.table t

Также нашёл описание что использование драйвера net.sourceforge.jtds тоже решает схожую проблему, но сам пока не попробовал. 

Комментариев нет:

Отправить комментарий