Khi có truy vấn tham số hóa trong cơ sở dữ liệu (câu lệnh đã chuẩn bị), việc gán giá trị cho tham số KHÔNG ĐƯỢC thay đổi cấu trúc và đường dẫn thực thi của truy vấn (nếu không cơ sở dữ liệu không coi chúng là truy vấn được tham số hóa và sẽ đưa ra ngoại lệ).
Đó là lý do tại sao bạn không thể chuẩn bị các câu lệnh cho các truy vấn như:
-
select * from myTable order by ?
-
select id, f1, ? from myTable
-
select * from ?
.
bởi vì việc gán giá trị cho mỗi tham số sẽ thay đổi đường dẫn thực thi truy vấn (hãy nhớ rằng truy vấn của câu lệnh đã chuẩn bị được phân tích cú pháp một lần và dẫn đến một đường dẫn thực thi duy nhất).
Các quy tắc tương tự áp dụng cho trình phân tích cú pháp truy vấn Hibernate, bạn sẽ không chỉ định một giá trị cho tham số làm thay đổi cấu trúc truy vấn.
Gán một chuỗi với các giá trị 1, 2, 3
thành một tham số NÊN-ĐỂ-ĐƯỢC-SỐ là giống nhau, trên thực tế, truy vấn đầu tiên sẽ được dịch giống như update weight_note_receipt set pledge_id =:pledge where wn_id = :wns
nhưng cái thứ hai sẽ được dịch là update weight_note_receipt set pledge_id =:pledge where (wn_id = :x1 or wn_id = :x2 or wn_id = :x3)
, rõ ràng là các truy vấn khác nhau với các đường dẫn thực thi khác nhau.
Vì vậy, ngay cả khi Hibernate không đưa ra một ngoại lệ, cơ sở dữ liệu của bạn sẽ.