Сопоставление с varchar и nvarchar в спящем режиме - PullRequest
12 голосов
/ 20 августа 2009

Если в базе данных есть 2 столбца, например.

code varchar(3)
name nvarchar(50)

Как сказать hibernate передать varchar для поиска по коду?

В hibernate mappings строка сопоставляется с nvarchar и выдает такие запросы:

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

Это очень плохо, так как вызывает сканирование индекса вместо операции поиска по индексу (сканирование всех узлов индекса вместо прямого перехода к запрошенному)

Поскольку код используется в миллионах строк, а также в нескольких индексах и внешних ключах, изменение его с varchar на nvarchar приведет к снижению производительности (больше операций ввода-вывода, поскольку nvarchar использует вдвое больше места, чем varchar).

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

Спасибо

Ответы [ 4 ]

7 голосов
/ 12 января 2010

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

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

;sendStringParametersAsUnicode=false;prepareSQL=0

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

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

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

1 голос
/ 22 сентября 2009

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

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

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

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

0 голосов
/ 24 июня 2016
<type-mapping>
        <sql-type jdbc-type="NVARCHAR" hibernate-type="string" />
 </type-mapping>

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

0 голосов
/ 31 января 2014

В hibernate.properties установите свойство hibernate.connection.defaultNChar = false.

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

...