13

データベースに 2 つの列がある場合。

code varchar(3)
name nvarchar(50)

コードで検索するために varchar を渡すように hibernate に指示する方法は?

休止状態のマッピングでは、文字列が nvarchar にマップされ、次のようなクエリが生成されます。

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

これは、インデックス シーク操作ではなくインデックス スキャンを引き起こすため、非常に悪いことです (要求されたインデックス ノードに直接移動するのではなく、すべてのインデックス ノードをスキャンします)。

コードは数百万の行といくつかのインデックスおよび外部キーで使用されるため、varchar から nvarchar に変更するとパフォーマンスが低下します (nvarchar は varchar の 2 倍のスペースを使用するため、より多くの IO 操作が行われます)。

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

ありがとう

4

4 に答える 4

9

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

jTDS JDBC ドライバーを使用しており、以下を追加してインデックス スキャンの問題を解決しました。

;sendStringParametersAsUnicode=false;prepareSQL=0

jTDS 接続文字列の最後に。

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

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

于 2010-01-11T21:01:08.723 に答える
2

HibernateではなくNHibernateについて話していると思います。これは、HibernateがデフォルトのSqlServer方言でnvarcharを使用していないためです。

問題を解決する方法は、マッピングで列タイプを「AnsiString」として指定することです。

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

詳細については、この投稿をご覧ください。

于 2009-09-22T04:18:06.690 に答える
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

于 2014-01-31T14:10:27.713 に答える