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 类型,我们在整个应用程序中广泛使用它,当我们使用非本地查询时它可以完美运行。为什么它不适用于本机查询?我什至使用了自定义方言并注册了类型,但它仍然无法正常工作。

非常感谢你的帮助

4

2 回答 2

4

您必须将数据类型关联NVARCHARString. 当通过 Session 接口使用 Hibernate 时,您可以明确地设置结果类型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——为清楚起见添加了引号)

于 2012-03-16T14:17:30.033 回答
2

你可以这样做:

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'"; 
于 2013-05-23T17:12:12.693 回答