Làm việc với IN
giới hạn là không hiệu quả và JPA không phải lúc nào cũng là công cụ phù hợp cho công việc. Hãy xem xét những điều sau:
-
Hàng nghìn giá trị bị ràng buộc sẽ dẫn đến khả năng là megabyte SQL. Sẽ mất nhiều thời gian để gửi SQL này đến cơ sở dữ liệu. Cơ sở dữ liệu có thể mất nhiều thời gian hơn để đọc văn bản SQL so với thực thi nó theo Câu trả lời của Tom cho câu hỏi" Giới hạn và chuyển đổi IN danh sách rất dài:WHERE x IN (,,, ...) " .
-
Nó sẽ không hiệu quả do phân tích cú pháp SQL. Không chỉ mất nhiều thời gian để phân tích cú pháp SQL dài này mà mỗi lệnh gọi có một số tham số ràng buộc khác nhau sẽ được phân tích cú pháp và lập kế hoạch riêng (xem bài viết này giải thích nó ).
-
Có một giới hạn cứng của các tham số ràng buộc trong một câu lệnh SQL. Bạn có thể lặp lại
OR
một vài lần để làm việc xung quanhIN
nhưng bạn sẽ đạt đến giới hạn câu lệnh SQL tại một số điểm.
Đối với những loại truy vấn đó, tốt hơn nên tạo tạm thời bảng
. Tạo một mã trước truy vấn của bạn, chèn tất cả các số nhận dạng vào đó và nối nó với bảng thực thể trong truy vấn của bạn để mô phỏng IN
tình trạng.
Lý tưởng nhất là bạn có thể thay thế JPA bằng một thủ tục được lưu trữ, đặc biệt nếu bạn đang lấy ra hàng chục nghìn số nhận dạng từ cơ sở dữ liệu chỉ để chuyển chúng trở lại cơ sở dữ liệu trong truy vấn tiếp theo.