2010-04-15 35 views
6

Một đồng nghiệp mới vừa đề xuất sử dụng truy vấn HQL được đặt tên trong Hibernate có chú thích (ví dụ: @NamedQuery) thay vì nhúng HQL vào các lớp XxxxRepository của chúng tôi.Hibernate có tên HQL truy vấn (trong chú thích) tối ưu hóa?

Những gì tôi muốn biết là liệu bằng cách sử dụng chú thích cung cấp bất kỳ lợi thế ngoại trừ tập trung truy vấn?

Đặc biệt, có một số đạt được biểu diễn, ví dụ vì truy vấn được chỉ phân tích một lần khi lớp được nạp hơn là mỗi khi các phương pháp Repository được thực hiện?

+0

và tôi thích truy vấn tiêu chí cho cả hai ... – NimChimpsky

Trả lời

8

từ Pro EJB 3 (Mike Keith):.

" ... chúng tôi khuyên các truy vấn tên bất cứ khi nào các nhà cung cấp có thể Persistence sẽ thường xuyên tiến hành các bước để precompile JPQL tên truy vấn SQL như là một phần của việc triển khai hoặc khởi tạo giai đoạn của một ứng dụng. "

Mặc dù cuốn sách này có trên JPA, lời khuyên chung áp dụng cho Hibernate. Tuy nhiên, kể từ khi bộ nhớ cache Hibernate phân tích cú pháp HQL/JPQL, bạn có thể sẽ không thấy được hiệu suất lớn. Một ưu điểm khác của việc sử dụng các truy vấn được đặt tên là nó cung cấp cho bạn tùy chọn ghi đè truy vấn bằng cách sử dụng tệp ánh xạ tại thời điểm triển khai mà không phải xây dựng lại ứng dụng của bạn; hữu ích nếu bạn cần tinh chỉnh truy vấn trong sản xuất.

5

Ngoài đạt được hiệu suất tốt, tôi tin rằng lợi thế khác sẽ là bằng cách sử dụng các truy vấn HQL với các chú thích, bạn có thể bảo vệ mình khỏi các cuộc tấn công SQL Injection.

Đối với một ứng dụng web, điều này rất quan trọng nếu các truy vấn chứa bất kỳ dữ liệu người dùng nhập vào. bình luận

http://en.wikipedia.org/wiki/SQL_injection

3

Lars' liên quan đến SQL injection là có khả năng gây nhầm lẫn, mặc dù tôi không nghĩ đó là ý định của mình, và tôi muốn cung cấp bối cảnh nhiều hơn một chút để các bình luận không hiểu lầm.

Đúng là tên truy vấn được tham số hóa bởi đặc điểm kỹ thuật, và việc sử dụng các thông số được đặt tên là một bước trong bảo vệ chống lại SQL injection. Tuy nhiên, nó không bảo vệ hoàn toàn khỏi việc tiêm SQL (tham khảo liên kết của anh ta để biết thêm). Các từ ngữ của bình luận cho thấy rằng việc sử dụng các truy vấn được đặt tên là bước cần thiết duy nhất trong việc bảo vệ chống lại các cuộc tấn công tiêm. Trong thực tế, các truy vấn bình thường có thể được tham số hóa và sẽ cung cấp cùng mức độ cách điện từ tấn công tiêm như các truy vấn được đặt tên và tham số hóa truy vấn của bạn chỉ là một trong số các bước cần thiết trong việc ngăn chặn các cuộc tấn công.

Để thêm vào nhận xét của Lars về các ứng dụng web, lưu ý rằng điều quan trọng là phải quét dữ liệu để bảo vệ chống lại các cuộc tấn công tiêm bất kể ứng dụng có đang ở bên ngoài hay không hoặc dữ liệu đầu vào có phải từ người dùng hay từ cơ sở dữ liệu khác hay không hoặc thậm chí cùng một cơ sở dữ liệu).

2

Cá nhân, tôi nghĩ hiệu suất đạt được ít quan trọng hơn thực tế là truy vấn hql của bạn được phân tích cú pháp trong khi khởi động máy chủ, cung cấp cho bạn các tin nhắn tức thì nếu truy vấn hql của bạn sai.

Tôi thích nắm bắt các lỗi này trước khi thử nghiệm thay vì trong thời gian.

Thời gian qua, trong thời gian thử nghiệm, tôi đi đến một truy vấn trong các mã mà không làm việc, đã có trong thực tế không bao giờ làm việc, vì vỏ. Điều này sẽ ngay lập tức trở nên rõ ràng trong khi khởi động máy chủ, khi sử dụng các truy vấn được đặt tên.

Và, ofcourse, tôi không thích có HQL được trộn lẫn với mã Java.

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