在hibernate中映射到varchar和nvarchar

时间:2009-08-20 15:00:01

标签: sql hibernate varchar nvarchar

如果数据库中有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类型?

由于

4 个答案:

答案 0 :(得分:7)

可能你已经解决了这个问题,但我遇到了类似的问题。

我正在使用jTDS JDBC驱动程序,我通过添加:

解决了索引扫描问题
;sendStringParametersAsUnicode=false;prepareSQL=0

到jTDS连接字符串的末尾。

可能它不会解决您的问题,因为通过这样做,jTDS将只使用VARCHAR(不再使用NVARCH)。

另外,我不得不禁用准备好的SQL,因为Hibernate在生成查询时使用'like'而不是'=',并且使用'like'结合变量(SELECT ... WHERE列LIKE @var)导致索引扫描(MSSQL 2000)。

答案 1 :(得分:1)

我假设你在谈论NHibernate而不是Hibernate,因为后者在默认的SqlServer方言中不使用nvarchar。

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

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

请查看this post了解详情。

答案 2 :(得分:0)

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

您可以隐藏视图后面的表或使用nstring类型。这种类型在hibernate-core 4.x中可用。在hibernate-core 3.6.10.Final中,您需要定义自定义类型nstring - 请参阅url中的注释: Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHAR

答案 3 :(得分:0)

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

在hibernate reveng文件中添加上述代码。