sql - Mapeo a varchar y nvarchar en hibernación
hibernate (4)
Si hay 2 columnas en la base de datos, ej.
code varchar(3)
name nvarchar(50)
¿Cómo decirle a hibernate que pase varchar para buscar por código?
En las cadenas de hibernación, la cadena se asigna a nvarchar y genera consultas como:
Select code, name From table where code=N''AAA'' (instead of code=''AAA'')
Esto es muy malo ya que causa el escaneo de índice en lugar de la operación de búsqueda de índice (escaneando todos los nodos de índice en lugar de ir directamente al solicitado)
Como el código se utiliza en millones de filas, así como en varios índices y claves foráneas, cambiarlo de varchar a nvarchar causará la degradación del 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
Probablemente ya resolvió esto, pero tuve un problema similar.
Estoy usando el controlador JTBC JDBC y resolví el problema de escaneo indexado al agregar:
;sendStringParametersAsUnicode=false;prepareSQL=0
hasta el final de la cadena de conexión jTDS.
Probablemente no haya resuelto su problema porque al hacerlo, jTDS solo usará VARCHAR (ya no habrá NVARCHAR).
Además, tuve que deshabilitar el SQL preparado, porque Hibernate usa ''like'' en lugar de ''='' al generar las consultas y al usar ''like'' combinado con una variable (SELECT ... WHERE column LIKE @var) causa un índice escanear (MSSQL 2000).
Supongo que está hablando de NHibernate en lugar de Hibernate porque este último no usa nvarchar en su dialecto SqlServer predeterminado.
La forma de resolver su problema es especificar el tipo de columna como "AnsiString" en su mapeo:
<property name="Code" type="AnsiString"/>
Eche un vistazo a esta publicación para más detalles.
<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.
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, tendrá que definir el tipo personalizado nstring; consulte el comentario en la url: Getting Hibernate y SQL Server para jugar bien con VARCHAR y NVARCHAR .