映射到休眠VARCHAR和nvarchar(Mapping to varchar and nvarc

2019-07-02 14:27发布

如果有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类型?

谢谢

Answer 1:

也许你已经解决了这一点,但我也有类似的问题。

我使用JTDS JDBC驱动程序和我加入解决了索引扫描问题:

;sendStringParametersAsUnicode=false;prepareSQL=0

到JTDS连接字符串的结尾。

也许它不会已经解决你的问题,因为这样做,JTDS将只使用VARCHAR(无NVARCHAR了)。

而且,我必须禁用准备SQL,因为Hibernate使用“喜欢”,而不是“=”时产生的查询,并通过使用“喜欢”具有可变组合(SELECT ... WHERE LIKE @var列)引起的索引扫描(MSSQL 2000)。



Answer 2:

我假设你在谈论的NHibernate,而不是休眠,因为后者没有在其默认的SqlServer方言使用nvarchar的。

为您解决问题的方法是指定列类型在映射“AnsiString类型”:

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

看看这篇文章的更多细节。



Answer 3:

在hibernate.properties设置属性hibernate.connection.defaultNChar = FALSE。

你可以隐藏你的表背后观点或使用nstring类型。 这种类型的可在休眠核心4.x版 在休眠核心3.6.10.Final您需要定义自定义类型nstring -请参阅网址注释: 获取休眠和SQL Server发挥好与VARCHAR和NVARCHAR 。



Answer 4:

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

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



文章来源: Mapping to varchar and nvarchar in hibernate