2012-03-16 12 views
3

私が取り組んでいるプロジェクトには、JPA 2.0(Hibernate 4実装)とSQL Server 2008 R2があります。JPA 2.0 - ネイティブクエリのNVARCHAR

SQLビューからデータを選択する必要があります。これを行うためにネイティブクエリを使用しますが、NVARCHARフィールドについていくつかの問題が発生しました。コードのこの部分を使用した場合、基本的に:

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タイプです:

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

は、私が言って例外を取得:

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は次のように宣言されていますこれはアプリケーション全体で広く使用されており、ネイティブでないクエリを使用しているときは完全に機能します。ネイティブクエリではなぜ機能しないのですか?私もカスタムの方言を使用して型を登録しましたが、それでも動作しません。あなたはSessionインターフェース経由でHibernateを使用して.When Stringにデータ型NVARCHARを関連付ける必要があり、あなたの助け

答えて

4

ため

どうもありがとう、あなたはexplcitly JPAでunwrap()経由代わりaddScalar()(もアクセス可能で、結果の種類を設定することができます2.0):

ので読むhereは、より多くの情報のため

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を編集 - 明快さのための追加された引用符を)

+0

はありがとうございます。私は試して、それがどうなるか見てみましょう。 –

+0

すごくうまくいって、ありがとう! –

+0

'addScalar'メソッドがもう存在しないようです –

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'"; 
関連する問題