13

如果数据库中有 2 列,例如。

code varchar(3)
name nvarchar(50)

如何告诉hibernate通过varchar进行代码搜索?

在休眠映射中,字符串被映射到 nvarchar 并产生如下查询:

Select code, name From table where code=N'AAA'  (instead of code='AAA')

这非常糟糕,因为它会导致索引扫描而不是索引查找操作(扫描所有索引节点而不是直接转到请求的节点)

由于代码用于数百万行以及多个索引和外键中,将其从 varchar 更改为 nvarchar 将导致性能下降(更多的 IO 操作,因为 nvarchar 使用的空间是 varchar 的两倍)。

有没有办法告诉hibernate根据数据库类型而不是Java类型进行映射?

谢谢

4

4 回答 4

9

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

我正在使用 jTDS JDBC 驱动程序,并通过添加以下内容解决了索引扫描问题:

;sendStringParametersAsUnicode=false;prepareSQL=0

到 jTDS 连接字符串的末尾。

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

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

于 2010-01-11T21:01:08.723 回答
2

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

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

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

看看这篇文章了解更多详情。

于 2009-09-22T04:18:06.690 回答
1
<type-mapping>
        <sql-type jdbc-type="NVARCHAR" hibernate-type="string" />
 </type-mapping>

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

于 2016-06-24T09:33:27.483 回答
0

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

您可以将表格隐藏在视图后面或使用 nstring 类型。这种类型在 hibernate-core 4.x 中可用。在 hibernate-core 3.6.10.Final 中,您将需要定义自定义类型 nstring - 请参阅 url 中的注释: 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 一起玩得很好

于 2014-01-31T14:10:27.713 回答