2009-08-20 75 views
11

如果數據庫中有2列,映射到休眠狀態下的varchar和nvarchar

code varchar(3) 
name nvarchar(50) 

如何告訴hibernate傳遞varchar通過代碼進行搜索?

在Hibernate映射串映射爲nvarchar和它產生查詢:

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

這是非常糟糕的,因爲它會導致索引掃描而不是索引查找操作(掃描所有的索引節點,而不是直接去請求一個)

由於代碼在數百萬行以及多個索引和外鍵中使用,因此將其從varchar更改爲nvarchar將導致性能下降(更多的IO操作,因爲nvarchar使用的空間比varchar多兩倍)。

有什麼辦法讓hibernate根據數據庫類型做映射,而不是Java類型嗎?

感謝

+0

在http://groups.google.com/group/nhusers – 2009-08-20 20:52:16

+0

上提問您想讓hiberntae通過nvarchar類型在數據庫中創建您的字段?或者是其他東西? – Am1rr3zA 2009-08-21 14:45:11

+0

我想讓hibernate將varchar參數傳遞給varchar類型,將nvarchar參數傳遞給nvarchar類型。 例如。插入到表(varcharCol,nvarcharCol)值('aaa',N'aaa') – Niikola 2009-09-01 22:38:16

回答

1

我假設你正在談論的NHibernate,而不是休眠,因爲後者沒有在其默認的SqlServer方言使用nvarchar的。

爲您解決問題的方法是指定列類型在映射「AnsiString類型」:

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

看看this post瞭解更多詳情。

+1

我們使用的是Hibernate,並且它將它們作爲nvarchar發送(由於索引掃描,它導致我們的SQL框中性能最大) – 2010-05-19 20:59:10

+0

遇到同樣的問題...找不到太多的信息,所以寫了它在這裏http://toddstechnonsense.blogspot.com/2010/11/nhibernate-performance-ansi-string-vs.html – Todd 2010-11-17 02:53:52

7

大概你已經解決了這個問題,但是我有一個類似的問題。

我使用JTDS JDBC驅動程序和我加入解決了索引掃描問題:

;sendStringParametersAsUnicode=false;prepareSQL=0 

到JTDS連接字符串的結尾。

也許它不會解決你的問題,因爲通過這樣做,jTDS將只使用VARCHAR(不再是NVARCHAR)。

此外,我不得不禁用準備的SQL,因爲Hibernate在生成查詢時使用'like'而不是'=',並且使用'like'與變量組合(SELECT ... WHERE column LIKE @var )導致索引掃描(MSSQL 2000)。

+1

; sendStringParametersAsUnicode = false爲我們解決了這個問題。我們不需要添加; prepareSQL = 0,因爲這對我們來說是正確的。 Thx! – Atle 2010-07-01 12:55:49

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

添加上面的代碼在休眠復仇文件。