2011-09-07 40 views
26

Có quy tắc/quy tắc thực hành tốt nhất/heuristic cho quyết định giữa API tiêu chíNamedQuery không?Truy vấn được đặt tên JPA và API tiêu chí?

Suy nghĩ của tôi cho đến thời điểm này:
Truy vấn được đặt tên thường dễ đọc hơn. Truy vấn tiêu chí linh hoạt hơn.
Cả hai đều được biên dịch trước. Tôi có xu hướng dựa vào việc sử dụng các truy vấn được đặt tên càng lâu càng tốt, sau đó thay đổi thành tiêu chí.

Nhưng có lẽ thôi thúc "truy vấn" truy vấn bằng cách sử dụng API tiêu chí là gợi ý cho thiết kế tối ưu (nghĩa là tách mối quan tâm)?

Cảm ơn bạn

Trả lời

33

Truy vấn được đặt tên là tối ưu hơn (chúng được phân tích cú pháp/chuẩn bị một lần). Truy vấn tiêu chí là động, (chúng không được biên dịch trước, mặc dù một số nhà cung cấp JPA như EclipseLink duy trì tiêu chí chuẩn bị bộ nhớ cache).

Tôi sẽ chỉ sử dụng tiêu chí cho truy vấn động.

+0

Tôi đồng ý. Câu trả lời tốt! – Robin

+4

Tôi thích chỉ sử dụng Tiêu chí. Kết hợp API tiêu chí với một siêu mô hình của thực thể và bạn hoàn toàn có thể từ bỏ việc sử dụng String và tạo mã đánh máy mạnh mẽ, cho một người đam mê Java thực sự thú vị! Tuy nhiên, tôi đã tìm thấy bài kiểm tra [this] (http://milestonenext.blogspot.se/2013/02/jpql-vs-criteria.html) thực sự cho thấy rằng Tiêu chí thực hiện thậm chí còn tồi tệ hơn JPQL! –

+0

Về mặt kỹ thuật, thử nghiệm hiệu suất không sử dụng Metamodel được tạo ra, phần tốt nhất về API tiêu chí JPA. Tôi đã gặp khó khăn lớn khi bắt đầu chuyển từ Hibernate Criteria sang JPA, nhưng bây giờ tôi thực sự thích JPA. – Yinzara

10

Truy vấn tiêu chí là lựa chọn tốt khi truy vấn phải được tạo động, dựa trên tiêu chí biến và nhiều tìm kiếm, ví dụ.

Đối với truy vấn tĩnh, JPQL dễ đọc hơn nhiều và tôi thích sử dụng chúng hơn truy vấn tiêu chí. Bạn có thể mất một số an toàn, nhưng các bài kiểm tra đơn vị sẽ làm cho bạn tự tin hơn.

3

Một quan điểm khác là mặc dù truy vấn tiêu chí không dễ đọc, nó an toàn, do đó cung cấp cho bạn biên dịch kiểm tra loại thời gian. Nếu bạn thay đổi cơ sở dữ liệu trong các dự án có nhiều thực thể và nhiều truy vấn, nó thực sự hữu ích để xem tại thời gian biên dịch các truy vấn nào đã sai do sự thay đổi.

Mặt khác, tôi không chắc chắn đó là lợi hơn so với các mộc của JPQL

2

tôi thực sự đã trải qua các Hibernate (4.3.0-SNAPSHOT) nguồn và EclipseLink (2.5.0-SNAPSHOT) và xem xét thông qua triển khai JPA trong mỗi.

EclipseLink rõ ràng không phải là chủ đề an toàn theo cách bạn mô tả. Cụ thể là nó cố tính toán lại các phép nối nhiều lần.

Triển khai của Hibernate trông an toàn cho chủ đề của tôi. Tôi không chắc chắn 100%, nhưng có vẻ như vậy. Tôi sẽ nói rằng điều này không được đảm bảo là đúng trong tương lai vì nó không được chỉ định.

Tuy nhiên, tôi sẽ cảnh báo bạn, tôi không nghĩ bạn sẽ đạt được nhiều. Từ những gì tôi đang xem xét, phần lớn việc biên dịch truy vấn thực sự được thực hiện trong giai đoạn "createQuery", do đó bạn thậm chí sẽ không thu được nhiều bộ nhớ đệm kết quả.

1

JPA cũng cung cấp cách để tạo truy vấn tĩnh, dưới dạng truy vấn được đặt tên, sử dụng chú thích @NamedQuery và @NamedQueries. Nó được coi là một thực hành tốt trong JPA để thích truy vấn được đặt tên trên truy vấn động khi có thể. Từ http://www.objectdb.com/java/jpa/query/api

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