Tôi là người mới sử dụng Hibernate và tôi đang viết một phương pháp đơn giản để trả về danh sách các đối tượng phù hợp với một bộ lọc cụ thể. List<Foo>
dường như là một kiểu trả lại tự nhiên.
Dù tôi làm gì đi nữa, tôi dường như không thể làm cho trình biên dịch hài lòng, trừ khi tôi thuê một người xấu xí @SuppressWarnings
.
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class Foo {
public Session acquireSession() {
// All DB opening, connection etc. removed,
// since the problem is in compilation, not at runtime.
return null;
}
@SuppressWarnings("unchecked") /* <----- */
public List<Foo> activeObjects() {
Session s = acquireSession();
Query q = s.createQuery("from foo where active");
return (List<Foo>) q.list();
}
}
Tôi muốn thoát khỏi điều đóSuppressWarnings
. Nhưng nếu tôi làm vậy, tôi sẽ nhận được cảnh báo
Warning: Unchecked cast from List to List<Foo>
(Tôi có thể bỏ qua nó, nhưng tôi không muốn lấy nó ngay từ đầu) và nếu tôi xóa tên chung để phù hợp với .list()
kiểu trả về, tôi sẽ nhận được cảnh báo
Warning: List is a raw type. References to generic type List<E>
should be parameterized.
Tôi nhận thấy rằng org.hibernate.mapping
không khai báo a List
; nhưng nó hoàn toàn là một kiểu khác - Query
trả về a java.util.List
, dưới dạng kiểu thô. Tôi thấy thật kỳ lạ khi một Hibernate (4.0.x) gần đây sẽ không triển khai các kiểu tham số hóa, vì vậy tôi nghi ngờ rằng thay vào đó tôi đã làm sai điều gì đó.
Nó trông rất giống kết quả Cast Hibernate tới một danh sách các đối tượng , nhưng ở đây tôi không gặp lỗi "khó" nào (hệ thống biết kiểu Foo và tôi không sử dụng SQLQuery mà là một Query thẳng). Vì vậy, không có niềm vui.
Tôi cũng đã xem xét Hibernate Class Cast Exception vì nó trông có vẻ hứa hẹn, nhưng sau đó tôi nhận ra rằng tôi thực sự không nhận được bất kỳ Exception
... vấn đề của tôi chỉ là một cảnh báo - một phong cách mã hóa, nếu bạn muốn.
Tài liệu trên jboss.org, hướng dẫn sử dụng Hibernate và một số hướng dẫn dường như không đề cập đến chủ đề một cách chi tiết như vậy (hoặc tôi đã không tìm kiếm ở đúng nơi?). Khi họ đi vào chi tiết, họ sử dụng tính năng truyền trực tiếp - và điều này trên các hướng dẫn không có trên trang jboss.org chính thức, vì vậy tôi hơi cảnh giác.
Mã, sau khi được biên dịch, chạy mà không có vấn đề gì rõ ràng ... mà tôi biết ... chưa; và kết quả là những điều mong đợi.
Vì vậy: tôi làm điều này có đúng không? Tôi đang thiếu một cái gì đó rõ ràng? Có một "chính thức" hoặc "đề nghị" cách làm như thế ?