2012-03-16 98 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'";