[英]Mapping to varchar and nvarchar in hibernate
如果數據庫中有2列,例如。
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類型?
謝謝
可能你已經解決了這個問題,但我遇到了類似的問題。
我正在使用jTDS JDBC驅動程序,我通過添加以下內容解決了索引掃描問題:
;sendStringParametersAsUnicode=false;prepareSQL=0
到jTDS連接字符串的末尾。
可能它不會解決您的問題,因為通過這樣做,jTDS將只使用VARCHAR(不再使用NVARCHAR)。
另外,我必須禁用准備好的SQL,因為Hibernate在生成查詢時使用'like'而不是'=',並且使用'like'結合變量(SELECT ... WHERE列LIKE @var)會導致索引掃描(MSSQL 2000)。
我假設你在談論NHibernate而不是Hibernate,因為后者在默認的SqlServer方言中不使用nvarchar。
解決問題的方法是在映射中將列類型指定為“AnsiString”:
<property name="Code" type="AnsiString"/>
請查看此帖子了解更多詳情。
<type-mapping>
<sql-type jdbc-type="NVARCHAR" hibernate-type="string" />
</type-mapping>
在hibernate reveng文件中添加上面的代碼。
在hibernate.properties中設置屬性hibernate.connection.defaultNChar = false。
您可以隱藏視圖后面的表或使用nstring類型。 這種類型在hibernate-core 4.x中可用。 在hibernate-core 3.6.10.Final中,您需要定義自定義類型nstring - 請參閱url中的注釋: 讓Hibernate和SQL Server與VARCHAR和NVARCHAR一起使用 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.