2009-08-20 3 views
11

データベースに2つの列がある場合、ハイバネートでのvarcharおよびnvarcharへのマッピング

code varchar(3) 
name nvarchar(50) 

コードで検索するためにvarcharを渡すようにhibernateに指示するにはどうすればよいですか? Hibernateのマッピング文字列で

がnvarchar型にマップされ、それはのようなクエリを生成している:

Select code, name From table where code=N'AAA' (instead of code='AAA') 

を、それがインデックスがシーク動作をインデックスするのではなく、スキャンを原因として、これは非常に悪いです(すべてのインデックス・ノードをスキャンする代わりに、直接に行きます

コードがvarcharからnvarcharに変更されると、パフォーマンスが低下します(nvarcharがvarcharより2倍多くの領域を使用するため、IO操作が増えます)。

Java型ではなく、データベース型に従ってマッピングするようにhibernateに指示する方法はありますか?

おかげ

+0

http://groups.google.com/group/nhusers –

+0

でこの質問をすると、hiberntaeはnvarchar型でデータベースにフィールドを作成しますか?または、他の何か? – Am1rr3zA

+0

私はhibernateがvarchar型にvarchar型を渡し、nvarchar型にnvarchar型を渡します。例えば、 。テーブルに挿入する(varcharCol、nvarcharCol)値( 'aaa'、N'aaa ') – Niikola

答えて

1

私はあなたがNHibernateの話をしていると仮定するというより、後者はそのデフォルトのSQLServerの方言ではnvarcharを使用していないため、休止しています。あなたの問題を解決するため

方法は、あなたのマッピングで「AnsiString型」として、列の型を指定することです:

<property name="Code" type="AnsiString"/> 

は、より多くの詳細については、this postを見てみましょう。

+1

私たちはHibernateを使用しており、nvarcharとしてそれらを送信しています(そして、インデックススキャンのために私たちのSQLボックスで最大のパフォーマンスが発生しています) –

+0

同じ問題に遭遇しました...ここhttp://toddstechnonsense.blogspot.com/2010/11/nhibernate-performance-ansi-string-vs.html – Todd

7

おそらくあなたはすでにこれを解決しましたが、同様の問題がありました。

私はのjTDS JDBCドライバを使用していると私は追加することによって、索引スキャンの問題を解決:

;sendStringParametersAsUnicode=false;prepareSQL=0 

をのjTDS接続文字列の最後に。

これを行うことで、jTDSはVARCHAR(NVARCHARはもう使用できません)のみを使用するため、おそらく問題は解決しませんでした。

また、Hibernateはクエリを生成するときに 'like'を使用し、変数と組み合わせて 'like'を使用するため、準備済みSQLを無効にする必要がありました(SELECT ... WHERE column LIKE @var )は、インデックススキャン(MSSQL 2000)を引き起こします。

+1

; sendStringParametersAsUnicode = falseはこの問題を解決しました。追加する必要はありません; prepareSQL = 0は、それが正しく動作していたからです。 Thx! – Atle

0

hibernate.propertiesでは、プロパティhibernate.connection.defaultNChar = falseを設定します。

ビューの後ろにテーブルを非表示にすることも、nstringタイプを使用することもできます。このタイプは、hibernate-core 4.xで利用可能です。 hibernate-core 3.6.10.Finalでは、カスタムタイプnstringを定義する必要があります - URLのコメントを参照してください: Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHAR

0
<type-mapping> 
     <sql-type jdbc-type="NVARCHAR" hibernate-type="string" /> 
</type-mapping> 

上記のコードをhibernate revengファイルに追加します。

関連する問題