2012-07-30 21 views
11

Ho bisogno di ottenere la stringa da una query di Hibernate e di elaborarla in un secondo momento (quindi non posso risolverlo con "hibernate.show_sql").Ottieni stringa SQL da Hibernate query

Ho già visto How to get SQL from Hibernate Criteria API (*not* for logging) ma con questa soluzione alternativa ottengo la stringa di query SQL ma invece di mostrare il valore dei parametri mostra '?' ... C'è un modo per ottenere la stringa SQL completa con i valori dei parametri?

Voglio dire, con questa soluzione ho "SELECT * FROM USER WHERE NAME=? AND SURNAME=?" ma ho bisogno di ottenere "SELECT * FROM USER WHERE NAME='John' AND SURNAME='Doe'" ...

idee?

+0

hai controllato una delle risposte? – jelies

risposta

1

C'è uno strumento chiamato p6spy. È un po 'più vecchio e temo che non venga più mantenuto. In ogni caso, mi ha dato buoni risultati in passato.

Modifica: appena scoperto che è stato attivamente sviluppato di nuovo. Funziona come un fascino per me!

1

Non esiste una "stringa SQL completa con i valori dei parametri".

Hibernate utilizza istruzioni preparate, pertanto invia la stringa di query con ? s ei valori dei parametri al database separatamente, in modo che la query effettiva non venga mai creata.

Forse è possibile trovare un modo per estrarre i valori dei parametri da QueryImpl, ma anche in questo caso non sarà possibile ottenere una query pronta per l'esecuzione, poiché sarà necessario gestire l'escape, conversione dei valori dei parametri in SQL letterali, ecc

+0

Grazie, temevo che non ci fosse una soluzione ... – diminuta

8

È necessario impostare TRACE livello di registrazione a questo pacchetto hibernate e parametro vincolante dovrebbe mostrare nel vostro registro di applicazione: ad esempio

<category name="org.hibernate.type"> 
     <priority value="TRACE"/> 
</category> 

uscita:

13:58:51,505 DEBUG [SQL] 
insert 
     into 
      s.audit 
      (action, e_s, ip, time, userid, id) 
     values 
      (?, ?, ?, ?, ?, ?) 
13:58:51,505 TRACE [StringType] binding 'Modify user' to parameter: 1 
13:58:51,505 TRACE [StringType] binding 'E' to parameter: 2 
13:58:51,505 TRACE [StringType] binding '164.20.81.65' to parameter: 3 
13:58:51,505 TRACE [TimestampType] binding '2012-07-30 13:58:51' to parameter: 4 
13:58:51,505 TRACE [IntegerType] binding '158' to parameter: 5 
13:58:51,505 TRACE [IntegerType] binding '8851' to parameter: 6 

E non dimenticare la proprietà 'hibernate.show_sql=true' che hai detto in precedenza per mostrare anche il relativo SQL.

+0

Va bene, ma avevo bisogno della query "intera", come: inserire nei valori s.audit (azione, e_s, ip, tempo, id utente, id) ("Modifica utente", "E", "164.20.81.65", "2012-07-30 13:58:51", "158", "8851") ... – diminuta

+0

"intero" query come hai detto non è possibile , questa è la soluzione più vicina che penso :( – jelies

+0

Grazie mille comunque: / – diminuta