2012-03-03 36 views
7

Tôi rất bối rối khi nào và khi nào không sử dụng các truy vấn gốc trong JPA 2.0. Tôi đã có ấn tượng rằng việc sử dụng các truy vấn gốc có thể khiến tôi không đồng bộ với bộ đệm JPA. Nếu tôi có thể thực hiện điều tương tự với truy vấn JPQL hoặc CriteriaBuilder, có lý do nào tốt để sử dụng truy vấn gốc không? Tương tự, có bất kỳ nguy hiểm nào khi sử dụng truy vấn gốc nếu tôi có thể thực hiện điều tương tự với JPQL hoặc CriteriaBuilder không? Và cuối cùng, nếu có nguy cơ trong việc sử dụng truy vấn gốc đến mức không đồng bộ với bộ nhớ cache JPA, sẽ có cùng mối nguy hiểm trong việc thực hiện truy vấn tương đương với JPQL hoặc CriteriaBuilder không?Khi nào một người nên sử dụng truy vấn gốc với JPA 2.0 thay vì JPQL hoặc CriteriaBuilder?

Triết lý của tôi đã tránh các truy vấn gốc, nhưng chắc chắn có những lúc cần thiết. Dường như với tôi rằng nếu tôi có thể làm điều đó với JPQL hoặc CriteriaBuilder, thì tôi nên làm.

Cảm ơn.

Trả lời

12

Tôi đồng ý với triết lý của bạn.

Vấn đề chính với truy vấn gốc, IMHO, là khả năng bảo trì. Trước hết, chúng thường phức tạp hơn và dài hơn các truy vấn JPQL. Nhưng chúng cũng mã hóa tên bảng và cột, thay vì sử dụng tên lớp và thuộc tính.

Truy vấn JPQL đã có vấn đề khi tái cấu trúc, vì chúng mã hóa cứng tên lớp và thuộc tính trong chuỗi. Nhưng các truy vấn tự nhiên thậm chí tệ hơn, bởi vì chúng mã hóa các tên bảng và cột ở mọi nơi.

Tôi không nghĩ rằng truy vấn chọn gốc là một vấn đề liên quan đến bộ nhớ cache. Tuy nhiên, bản cập nhật gốc, chèn và xóa truy vấn là một vấn đề, bởi vì chúng sửa đổi dữ liệu phía sau bộ đệm ẩn thứ nhất và thứ hai. Vì vậy, chúng có thể trở nên cũ.

Một vấn đề khác là truy vấn gốc của bạn có thể sử dụng cú pháp được cơ sở dữ liệu nhận dạng nhưng không phải bởi một cơ sở dữ liệu khác, làm cho ứng dụng khó di chuyển từ cơ sở dữ liệu này sang cơ sở dữ liệu khác.

+0

Giải thích tuyệt vời @JB Nizet như mọi khi. Câu hỏi cũng hỏi về Trình tạo tiêu chí. Sự hiểu biết của tôi là các truy vấn Tiêu chí rất hữu ích để duy trì an toàn loại (mà JPQL không cung cấp như được đề cập trong câu trả lời của bạn). Tuy nhiên, cá nhân tôi thấy Criteria API rất cồng kềnh và khó đọc. Có bất kỳ lợi thế nào khác của API tiêu chí trên JPQL không ?? – HopeKing

+1

Tôi cũng thấy API này rất cồng kềnh và không trực quan để sử dụng và khó đọc hơn. Tôi chỉ sử dụng API này khi tôi cần phải tạo một truy vấn động dựa trên ... tiêu chí (do đó tên của API). Ví dụ, khi người dùng gửi một biểu mẫu tìm kiếm với một số tiêu chí tùy chọn (tên, tên, ngày bith tối thiểu, ngày sinh tối đa, bất kỳ điều gì), các phần tử mệnh đề khác nhau phải được thêm vào hoặc không phụ thuộc vào sự hiện diện hoặc vắng mặt của các tiêu chí đó. –

+0

Đến mức này và rất rõ ràng. Cảm ơn. – HopeKing

Các vấn đề liên quan