Når du har parametriserede forespørgsler i databaser (forberedte udsagn), MÅ tildeling af værdier til parametre IKKE ændre strukturen og udførelsesstien for forespørgslen (ellers behandler databaser dem ikke som parametriserede forespørgsler og vil give undtagelser).
Det er derfor, du ikke kan have forberedt erklæringer til forespørgsler som:
select * from myTable order by ?
select id, f1, ? from myTable
select * from ?
.
fordi tildeling af en værdi til hver parameter ændrer forespørgselsudførelsesstien (husk, at forberedte udsagns forespørgsel parses én gang og resulterer i en enkelt udførelsessti).
De samme regler gælder for Hibernate-forespørgselsparser, du må ikke tildele en parameter en værdi, der ændrer forespørgselsstrukturen.
Tildeling af en streng med værdierne 1, 2, 3
til et SKAL-AT-VÆRE-ET-NUMMER parametre er det samme, faktisk vil den første forespørgsel blive oversat på samme måde som update weight_note_receipt set pledge_id =:pledge where wn_id = :wns
men den anden vil blive oversat som update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3)
, åbenbart forskellige forespørgsler med forskellige udførelsesstier.
Så selvom Hibernate ikke kastede en undtagelse, ville din database gøre det.