2009-08-20 14 views
11

Se ci sono 2 colonne nel database, ad es.Mappatura a varchar e nvarchar in sospensione

code varchar(3) 
name nvarchar(50) 

Come dire a hibernate di passare varchar per la ricerca per codice?

Nella stringa di mapping Hibernate è mappata nvarchar e produce query come:

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

Questo è molto grave come provoca indice di scansione invece dell'indice operazione di ricerca (scansione di tutti nodi indice anziché direttamente andare richiesto)

Poiché il codice viene utilizzato in milioni di righe nonché in diversi indici e chiavi esterne, la modifica da varchar a nvarchar causerà un peggioramento delle prestazioni (più operazioni di I/O poiché nvarchar utilizza il doppio di spazio rispetto a varchar).

C'è un modo per indicare che l'ibernazione esegue il mapping in base al tipo di database, non al tipo Java?

Grazie

+0

Chiedi questa domanda su http://groups.google.com/group/nhusers –

+0

se vuoi ibernare rendere il tuo campo nel database di tipo nvarchar? o qualcos'altro? – Am1rr3zA

+0

Desidero che hibernate passi il parametro varchar al tipo varchar e il parametro nvarchar al tipo nvarchar. es.Inserisci nella tabella (varcharCol, nvarcharCol) Valori ('aaa', N'aaa ') – Niikola

risposta

1

sto supponendo che si sta parlando di NHibernate, piuttosto che Hibernate perché quest'ultimo non usa nvarchar nel suo dialetto di default SqlServer.

Il modo per risolvere il tuo problema è quello di specificare il tipo di colonna come "AnsiString" nella vostra mappatura:

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

Date un'occhiata a this post per maggiori dettagli.

+1

Stiamo usando Hibernate e li sta inviando come nvarchar (e sta causando il più grande impatto sulle prestazioni del nostro box SQL a causa della scansione dell'indice) –

+0

Ran nello stesso problema ... non ho trovato molte informazioni così ho scritto qui sopra http://toddstechnonsense.blogspot.com/2010/11/nhibernate-performance-ansi-string-vs.html – Todd

7

Probabilmente hai già risolto questo problema, ma ho avuto un problema simile.

Sto utilizzando il driver JDBC jTDS e risolto il problema indice di scansione aggiungendo:

;sendStringParametersAsUnicode=false;prepareSQL=0 

alla fine della stringa di connessione jTDS.

Probabilmente non avrebbe risolto il problema perché in questo modo, jTDS utilizzerà solo VARCHAR (non più NVARCHAR).

Inoltre, ho dovuto disabilitare l'SQL preparato, perché Hibernate utilizza 'like' invece di '=' durante la generazione delle query e utilizzando 'like' combinato con una variabile (SELECT ... WHERE colonna LIKE @var) provoca una scansione dell'indice (MSSQL 2000).

+1

; sendStringParametersAsUnicode = false ha risolto questo problema per noi. Non abbiamo bisogno di aggiungere; prepareSQL = 0 poiché funzionava correttamente per noi. Thx! – Atle

0

In hibernate.properties impostare la proprietà hibernate.connection.defaultNChar = false.

È possibile nascondere le tabelle dietro le viste o utilizzare il tipo di nstring. Questo tipo è disponibile in hibernate-core 4.x. In hibernate-core 3.6.10.Final dovrai definire il tipo personalizzato nstring - vedi il commento nell'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> 

Aggiungere il codice sopra nel file di revengna di ibernazione.

Problemi correlati