JPA 2.0 - 原生查询中的NVARCHAR

3
我正在处理的项目具有以下设置: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个回答

6
你需要将数据类型 NVARCHARString 相关联。当通过 Session 接口使用 Hibernate 时,你可以使用 addScalar() 显式地设置结果的类型(在 JPA 2.0 中也可以通过 unwrap() 访问):

因此,请按以下方式修改您的代码:

 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 -- 为了清晰起见添加引号)


谢谢。我会尝试一下,看看情况如何。 - Daniel Platon
似乎方法“addScalar”不再存在。 - pouyan021

3
你可以这样做:
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'"; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接