Подтвердить что ты не робот

Отображение в varchar и nvarchar в спящем режиме

Если в базе данных есть 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 приведет к ухудшению производительности (больше операций ввода-вывода, поскольку nvarchar использует в два раза больше пространства, чем varchar).

Есть ли способ сообщить hibernate делать сопоставление в соответствии с типом базы данных, а не с типом Java?

Спасибо

4b9b3361

Ответ 1

Возможно, вы уже решили это, но у меня была аналогичная проблема.

Я использую драйвер JTDS JDBC, и я решил проблему сканирования индекса, добавив:

;sendStringParametersAsUnicode=false;prepareSQL=0

до конца строки подключения jTDS.

Вероятно, это не решило бы вашу проблему, потому что, делая это, jTDS будет использовать только VARCHAR (больше нет NVARCHAR).

Кроме того, мне пришлось отключить подготовленный SQL, потому что Hibernate использует 'like' вместо '=' при генерации запросов и используя 'like' в сочетании с переменной (SELECT... WHERE column LIKE @var) вызывает сканирование индекса (MSSQL 2000).

Ответ 2

Я предполагаю, что вы говорите об NHibernate, а не в Hibernate, потому что последний не использует nvarchar в своем диалекте SqlServer по умолчанию.

Способ решения вашей проблемы - указать тип столбца как "AnsiString" в вашем сопоставлении:

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

Взгляните на этот пост для более подробной информации.

Ответ 3

В hibernate.properties задайте свойство hibernate.connection.defaultNChar = false.

Вы можете либо скрыть свои таблицы за просмотром, либо использовать тип nstring. Этот тип доступен в hibernate-core 4.x. В hibernate-core 3.6.10.Final вам нужно будет указать настраиваемый тип nstring - см. Комментарий в URL-адресе: Получение Hibernate и SQL Server для работы с VARCHAR и NVARCHAR.

Ответ 4

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

Добавьте указанный выше код в файл спящего режима.