Mysql
 sql >> Database >  >> RDS >> Mysql

Ibernazione:impossibile eseguire la query di manipolazione di massa nativa

Quando si hanno query parametrizzate nei database (istruzioni preparate), l'assegnazione di valori ai parametri NON DEVE modificare la struttura e il percorso di esecuzione della query (altrimenti i database non li trattano come query parametrizzate e genereranno un'eccezione).

Ecco perché non puoi aver preparato dichiarazioni per query come:

  • select * from myTable order by ?
  • select id, f1, ? from myTable
  • select * from ? .

perché l'assegnazione di un valore a ciascun parametro cambia il percorso di esecuzione della query (ricorda che la query delle istruzioni preparate viene analizzata una volta e risulta un unico percorso di esecuzione).

Le stesse regole si applicano al parser di query Hibernate, non devi assegnare a un parametro un valore che modifichi la struttura della query.

Assegnazione di una stringa con valori 1, 2, 3 in un parametro SHOULD-TO-BE-A-NUMBER è lo stesso, infatti la prima query verrà tradotta esattamente come update weight_note_receipt set pledge_id =:pledge where wn_id = :wns ma il secondo sarà tradotto come update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3) , ovviamente query diverse con percorsi di esecuzione diversi.

Quindi, anche se Hibernate non ha generato un'eccezione, il tuo database lo farebbe.