3

私が取り組んでいるプロジェクトには、JPA 2.0(Hibernate 4実装)とSQL Server2008R2のセットアップがあります。

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

データ型NVARCHARをに関連付けるString必要があります。Session インターフェイスを介して Hibernate を使用する場合、代わりに結果の型を明示的に設定できます( JPA 2.0addScalar()からもアクセスできます)。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();

詳細については、こちらをお読みください。

(2015 年 7 月 1 日編集 -- 明確にするために引用符を追加)

于 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 に答える