簡體   English   中英

在hibernate中映射到varchar和nvarchar

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM