如果有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使用“喜欢”,而不是“=”时产生的查询,并通过使用“喜欢”具有可变组合(SELECT ... WHERE LIKE @var列)引起的索引扫描(MSSQL 2000)。
我假设你在谈论的NHibernate,而不是休眠,因为后者没有在其默认的SqlServer方言使用nvarchar的。
为您解决问题的方法是指定列类型在映射“AnsiString类型”:
<property name="Code" type="AnsiString"/>
看看这篇文章的更多细节。
在hibernate.properties设置属性hibernate.connection.defaultNChar = FALSE。
你可以隐藏你的表背后观点或使用nstring类型。 这种类型的可在休眠核心4.x版 在休眠核心3.6.10.Final您需要定义自定义类型nstring -请参阅网址注释: 获取休眠和SQL Server发挥好与VARCHAR和NVARCHAR 。
<type-mapping>
<sql-type jdbc-type="NVARCHAR" hibernate-type="string" />
</type-mapping>
添加上面的代码在休眠复仇文件。