JPA 2.0 - NVARCHAR в собственном запросе - PullRequest
3 голосов
/ 16 марта 2012

Проект, над которым я работаю, имеет следующую настройку: JPA 2.0 (реализация Hibernate 4) и SQL Server 2008 R2.

Мне нужно выбрать некоторые данные в представлении SQL.Для этого я использую собственный запрос, но столкнулся с некоторыми проблемами с полями NVARCHAR.В основном, при использовании этого фрагмента кода:

 String sql = "SELECT v.text_field as address FROM SOME_CUSTOM_VIEW v
 Query q = entityManager.createNativeQuery(sql,"ItemDetailsMapping");
 List<Object[]> result = q.getResultList();

ItemDetailsMapping объявляется как:

@SqlResultSetMapping(name = "ItemDetailsMapping", columns = { @ColumnResult(name = "address") })

Я получаю исключение:

org.springframework.orm.hibernate3.HibernateSystemException: No Dialect mapping for JDBC     type: -9; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

ТипНа самом деле 9 - это тип NVARCHAR, который мы широко используем во всем приложении, и он отлично работает, когда мы используем не нативные запросы.Почему он не работает с нативными запросами?Я даже использовал собственный диалект и зарегистрировал тип, но он все еще не работает.

Большое спасибо за вашу помощь

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Вы должны связать тип данных NVARCHAR с String. Когда вы используете Hibernate через интерфейс Session, вы можете точно установить тип результата вместо addScalar() (также доступен через unwrap() в JPA 2.0):

Поэтому измените ваш код, как показано ниже,

 String sql = "SELECT v.text_field as address FROM SOME_CUSTOM_VIEW v"
 Query q = entityManager.createNativeQuery(sql,"ItemDetailsMapping");
 q.unwrap(SQLQuery.class).addScalar("address ", StringType.INSTANCE);
 List<Object[]> result = q.getResultList();

Прочитайте здесь для получения дополнительной информации.

(Изменить 7/1/15 - Добавленокавычка для наглядности)

2 голосов
/ 23 мая 2013

Вы можете сделать это так:

String myquery = "select cast(t2.name as varchar) column_name from sys.objects t1 inner join sys.columns t2 on t2.object_id = t1.object_id"+ 
" left join sys.indexes t3 on t3.object_id = t1.object_id and t3.is_unique = 1 left join sys.index_columns t4 on t4.object_id = t1.object_id and t4.index_id = t3.index_id and t4.column_id = t2.column_id where (upper(t1.type) = 'U' or upper(t1.type) = 'V') and upper(schema_name(t1.schema_id)) = 'dbo' and upper(t1.name) = 'TEST'"; 
...