2009-08-20 24 views
11

Si hay 2 columnas en la base de datos, p. Ej.Asignación a varchar y nvarchar en hibernación

code varchar(3) 
name nvarchar(50) 

Cómo decir hibernate para pasar varchar para buscar por código?

En la cadena de asignaciones de hibernación se asigna a nvarchar y produce consultas como:

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

Esto es muy malo, ya que causa exploración de índice en lugar del índice de operación de búsqueda (el escaneo de todos los nodos de índice en lugar de directamente va a solicitado)

Como el código se usa en millones de filas y en varios índices y claves foráneas, al cambiarlo de varchar a nvarchar se degradará el rendimiento (más operaciones de IO ya que nvarchar usa el doble de espacio que varchar).

¿Hay alguna manera de decirle a hibernate que haga la asignación de acuerdo con el tipo de base de datos, no con el tipo de Java?

Gracias

+0

Haga esta pregunta en http://groups.google.com/group/nhusers –

+0

¿desea hiberntar su campo en la base de datos por tipo nvarchar? ¿o algo mas? – Am1rr3zA

+0

Quiero hibernar para pasar el parámetro varchar al tipo varchar y el parámetro nvarchar al tipo nvarchar. por ej.Insertar en la tabla (varcharCol, nvarcharCol) Valores ('aaa', N'aaa ') – Niikola

Respuesta

1

Asumo que estás hablando NHibernate en lugar de Hibernate ya que este último no utiliza nvarchar en su dialecto SqlServer por defecto.

La manera de resolver el problema es especificar el tipo de columna como "AnsiString" en su asignación:

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

Tome un vistazo a this post para más detalles.

+1

Estamos usando Hibernate y los está enviando como nvarchar (y está causando el mayor golpe de rendimiento en nuestro cuadro de SQL debido a la exploración de índice) –

+0

Se metió en el mismo problema ... no pudo encontrar mucha información, así que escribió aquí http://toddstechnonsense.blogspot.com/2010/11/nhibernate-performance-ansi-string-vs.html – Todd

7

Probablemente ya haya resuelto esto, pero tuve un problema similar.

estoy usando controlador JDBC jTDS y resuelto el problema recorrido de índice añadiendo:

;sendStringParametersAsUnicode=false;prepareSQL=0 

hasta el final de la cadena de conexión jTDS.

Probablemente no habría resuelto su problema porque al hacerlo, jTDS solo usará VARCHAR (ya no NVARCHAR).

Además, tuve que deshabilitar el SQL preparado, porque Hibernate está usando 'like' en lugar de '=' al generar las consultas y usando 'like' combinado con una variable (SELECT ... WHERE column LIKE @var) causa un escaneo de índice (MSSQL 2000).

+1

; sendStringParametersAsUnicode = false resolvió este problema para nosotros. No necesitábamos agregar; prepareSQL = 0 ya que eso funcionaba correctamente para nosotros. ¡Gracias! – Atle

0

En hibernate.properties establezca la propiedad hibernate.connection.defaultNChar = false.

Puede ocultar sus tablas detrás de las vistas o usar el tipo nstring. Este tipo está disponible en hibernate-core 4.x. En hibernate-core 3.6.10.Final, deberá definir el tipo personalizado nstring; consulte el comentario en la url: Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHAR.

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

Agregue el código anterior en el archivo de revenge de hibernación.

Cuestiones relacionadas