Mysql
 sql >> Base de données >  >> RDS >> Mysql

Hibernate :impossible d'exécuter la requête de manipulation en masse native

Lorsque vous avez des requêtes paramétrées dans des bases de données (instructions préparées), l'attribution de valeurs aux paramètres NE DOIT PAS modifier la structure et le chemin d'exécution de la requête (sinon les bases de données ne les traitent pas comme des requêtes paramétrées et lèveront une exception).

C'est pourquoi vous ne pouvez pas préparer d'instructions pour des requêtes telles que :

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

car l'attribution d'une valeur à chaque paramètre modifie le chemin d'exécution de la requête (rappelez-vous que la requête des instructions préparées est analysée une fois et génère un seul chemin d'exécution).

Les mêmes règles s'appliquent à l'analyseur de requête Hibernate, vous ne devez pas attribuer à un paramètre une valeur qui modifie la structure de la requête.

Affectation d'une chaîne avec les valeurs 1, 2, 3 à un paramètre SHOULD-TO-BE-A-NUMBER est identique, en fait la première requête sera traduite de la même manière que update weight_note_receipt set pledge_id =:pledge where wn_id = :wns mais le second sera traduit par update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3) , évidemment des requêtes différentes avec des chemins d'exécution différents.

Ainsi, même si Hibernate ne levait pas d'exception, votre base de données le ferait.