2009-08-20 72 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> 

添加上面的代码在休眠复仇文件。