2012-03-16 48 views
3

我正在处理的项目具有以下设置:JPA 2.0(Hibernate 4实现)和SQL Server 2008 R2。JPA 2.0 - 本机查询中的NVARCHAR

我需要从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类型,这是我们在整个应用程序中广泛使用的,当我们使用非本地查询时,它完美地工作。为什么它不适用于原生查询?我甚至使用了自定义方言并注册了类型,但仍然无法使用。

非常感谢您的帮助

回答

4

你必须NVARCHARString。当通过Session接口使用Hibernate的数据类型相关联,可以在explcitly JPA设置一个类型的结果与addScalar()而不是(也可以通过unwrap() 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(); 

阅读here以获取更多信息。

(编辑15年7月1日 - 为清楚起见,增加了引号)

+0

谢谢。我会试一试,看看它是如何发展的。 – 2012-03-19 10:26:40

+0

非常好,非常感谢! – 2012-03-27 07:48:36

+0

似乎'addScalar'方法不再存在了 – 2017-07-13 07:00:14

1

你可以这样说:

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'";