2012-02-27 9 views
16

Sto usando Hibernate. Ho scritto alcune query native perché ho bisogno di usare la dichiarazione di selezione secondaria.Come posso utilizzare l'operatore di assegnazione MySQL (: =) nella query nativa di ibernazione?

query è simile al seguente:

SELECT sub.rownum FROM 
    (SELECT k.`news_master_id` AS id, @row := @row + 1 AS rownum 
     FROM keyword_news_list k 
     JOIN (SELECT @row := 0) r 
     WHERE k.`keyword_news_id` = :kid 
    ORDER BY k.`news_master_id` ASC) AS sub 
WHERE sub.id = :nid 

Quando eseguo questa query come questa:

sessionFactory.getCurrentSession() 
    .createSQLQuery(query) 
    .setParameter("kid", kid) 
    .setParameter("nid", nid) 
    .uniqueResult(); 

Questa eccezione viene fuori:

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' .... 

Questo potrebbe a causa di := dell'operatore. Ho trovato alcuni Hibernate issue su questo. Questo problema è ancora aperto. Non c'è alcuna soluzione per questo problema?

+0

C'è qualche cosa che può aiutarti da qui? http://dev.mysql.com/doc/refman/5.0/en/assignment-operators.html#operator_assign-value – ManuPK

+0

@ManuPK Grazie, ma non è stato d'aiuto. Penso che non ci sia una soluzione per la mia domanda. Ho trovato una domanda simile con la mia http://stackoverflow.com/questions/2712240/how-to-use-mysql-variables-with-hibernate ma non c'è una buona soluzione. –

risposta

5

è possibile implementare questo è un modo leggermente diverso .. è necessario sostituire il: operatore con qualcos'altro (ad esempio '|' char) e nel tuo intercettore sostituire '|' con il : .

questo modo di ibernazione non provare a pensare il: è un parametro, ma lo ignorerà

Per la logica di intercettazione si può fare riferimento al hibernate manual

Questo ha funzionato per me usando MySQL 5.

ricorda che questa sostituzione di: deve essere eseguita solo su ': =' e altri requisiti specifici di MySQL .. non provare a sostituire: per i segnaposti param. (Hibernate non sarà in grado di identificare i parametri quindi)

+0

Buono! Ci proverò. –

+4

COME STUPIDO È HIBERNATE HUH? Posso immaginare il programmatore in corso. Nah, come mai potrebbero esserci due punti nell'SQL. Nessuna possibilità!Facciamolo in modo che non ci sia un meccanismo di fuga! – droope

+1

Scusa, ero un po 'incazzato di dover lavorare. La soluzione sopra è solo se hai solo un martello. Puoi anche usare \: per scappare dai due punti, anche se nel mio caso ha rotto ogni singolo parametro chiamato (hanno appena smesso di funzionare.) – droope

-5

Credo che non ci dovrebbe essere uno spazio dopo =, l'operatore dovrebbe essere scritto come =: (senza spazi)

+0

Ho provato, ma non funziona. –

24

Nota che HHH-2697 è stato corretto per Hibernate 4.1.3 e testato su Hibernate 4.3.8.Final; Dovete fuggire con backslash:

SELECT k.`news_master_id` AS id, @row \:= @row + 1 AS rownum 
    FROM keyword_news_list k 
    JOIN (SELECT @row \:= 0) r 
    WHERE k.`keyword_news_id` = :kid 
ORDER BY k.`news_master_id` ASC 
+3

usando ** Hibernate 4.3.7 è sufficiente una sola barra rovesciata **, ad es. PG 9.3 query 'select f (p_tst \: = 1)' (dove potrebbe essere due in stringhe Java per sfuggirle) –

0

preferisco includere primavera JDBC ed eseguire la query piuttosto che combattere contro intercettori Hibernate.

14

Un'altra soluzione per quelli di noi che non possono effettuare il salto in modalità ibernazione 4.1.3.
Basta usare /*'*/:=/*'*/ all'interno della query. Il codice Hibernate tratta tutto tra ' come stringa (lo ignora). D'altra parte, MySQL ignorerà tutto all'interno di una blockquote e valuterà l'intera espressione a un operatore di assegnamento.
So che è veloce e sporco, ma ottengo è il lavoro fatto senza stored procedure, intercettori ecc

+0

Ottimo, funziona per me. –

Problemi correlati