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

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

code varchar(3)
name nvarchar(50)

Как указать спящему режиму передавать varchar для поиска по коду?

В сопоставлении гибернации строка сопоставляется с nvarchar и производит такие запросы, как:

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

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

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

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

Спасибо


person Niikola    schedule 20.08.2009    source источник
comment
Задайте этот вопрос на странице groups.google.com/group/nhusers   -  person Stefan Steinegger    schedule 21.08.2009
comment
вы хотите, чтобы ваше поле было в спящем режиме в базе данных по типу nvarchar? или что-то другое?   -  person Am1rr3zA    schedule 21.08.2009
comment
Я хочу, чтобы hibernate передавал параметр varchar типу varchar, а параметр nvarchar - типу nvarchar. например. Вставить в таблицу (varcharCol, nvarcharCol) Значения ('aaa', N'aaa ')   -  person Niikola    schedule 02.09.2009
comment
@Niikola, вы решили проблему? у меня есть такой же   -  person Gilbert    schedule 13.12.2016


Ответы (4)


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

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

person Tanuj Verma    schedule 24.06.2016

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

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

;sendStringParametersAsUnicode=false;prepareSQL=0

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

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

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

person Gilberto Olimpio    schedule 11.01.2010
comment
; sendStringParametersAsUnicode = false решил эту проблему за нас. Нам не нужно было добавлять; prepareSQL = 0, поскольку это сработало для нас правильно. Спасибо! - person Atle; 01.07.2010

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

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

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

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

person ChssPly76    schedule 22.09.2009
comment
Мы используем Hibernate, и он отправляет их как nvarchar (и это вызывает наибольшее снижение производительности нашего SQL-блока из-за сканирования индекса) - person Eric Labashosky; 20.05.2010
comment
Столкнулся с той же проблемой ... не смог найти много информации, поэтому написал ее здесь toddstechnonsense.blogspot.com/2010/11/ - person Todd; 17.11.2010

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

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

person razvanone    schedule 31.01.2014