2009-06-05 49 views
24

Xin chào mọi người, tôi mới đến kiên trì/ngủ đông và tôi cần sự giúp đỡ của bạn.Java Persistence: Truyền tới kết quả của Query.getResultList()?

Đây là tình huống. Tôi có một cái bàn có chứa một số thứ. Hãy gọi họ là Người. Tôi muốn nhận tất cả các mục từ cơ sở dữ liệu nằm trong bảng đó.

Tôi có một lớp người đó là một POJO đơn giản với một tài sản cho mỗi cột trong bảng (tên, tuổi, ..)

Dưới đây là những gì tôi có:

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = lQuery.getResultList(); 

Tuy nhiên, tôi nhận được một cảnh báo nói rằng đây là một chuyển đổi không được kiểm soát từ List để List<Person>

tôi nghĩ rằng chỉ đơn giản là thay đổi mã để

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = (List<Person>)lQuery.getResultList(); 

sẽ hoạt động .. nhưng không.

Có cách nào để thực hiện việc này không? Sự kiên trì có cho phép tôi đặt kiểu trả về của truy vấn không? (Thông qua generics có thể?)

Trả lời

59

Là một người mới đến JPA đã coi đây như câu trả lời dứt khoát nhưng sau đó tôi tìm thấy một tốt hơn qua câu hỏi này: Why in JPA EntityManager queries throw NoResultException but find does not?

của nó đơn giản như khi sử dụng TypedQuery thay vì truy vấn ví dụ:

TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class); 
List<Person> personList = lQuery.getResultList(); 
+0

Bạn thưa bạn, đã cho tôi câu trả lời tốt nhất. Cảm ơn bạn. ++++ 1 –

1

Tôi đã bị mắc kẹt với vấn đề này trong một thời gian, quá. Bạn có thể lặp qua danh sách, và kiểm tra, nhưng tôi muốn ít tiếng ồn hơn. Cách ngắn nhất mà tôi đã nhìn thấy xung quanh điều này là để làm im lặng cảnh báo, nhưng tôi cũng rất khó chịu với điều đó. Tôi muốn được quan tâm để xem các giải pháp khác.

@SuppressWarnings("unchecked") 
List<Person> personList = lQuery.getResultList(); 

Hmm, trong khi nghiên cứu tôi đã tìm thấy một thú vị post trên java.net. Tôi nhận thấy ý kiến ​​của người dùng đặc biệt thú vị.

2

Cũng có là giải pháp java Collections lớp, nhưng bạn đã không giải thích cách đúc của bạn đã thất bại, hoặc nếu nó chỉ đưa ra một cảnh báo ...

Đây là một cách để xác nhận điều này:

Collections.checkList(lQuery.getResultList(), Person.class); 

Nhưng nếu bạn không cần phải xác nhận điều đó:

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList(); 
+0

Tôi không giải thích cách đúc của tôi đã thất bại vì nó không phải là thất bại. Nó chỉ đơn giản là không im lặng Cảnh báo .. do đó, nó không làm bất cứ điều gì. – GuiSim

9

Lưu ý: Câu trả lời này là lỗi thời như của JPA 2.0, cho phép bạn xác định typ dự kiến e. Xem this answer.


cấm mức cảnh báo với

@SuppressWarnings("unchecked") 
List<MyType> result = (List<MyType>) query.getResultList(); 

là giải pháp duy nhất cho vấn đề này, tôi đã từng gặp. Sự đàn áp là xấu, nhưng bạn có thể tin tưởng JPA trả về đúng loại đối tượng, vì vậy không cần kiểm tra thủ công.

Nếu bạn sử dụng đa hình và không biết loại kết quả chính xác, việc sử dụng Generics với một giáp Class tham số cũng là một mô hình phổ biến:

public List<T extends MyBaseType> findMyType(Class<T> type) { 
    @SuppressWarnings("unchecked") 
    List<T> result = (List<T>) this.entityManager.createQuery(
     "FROM " + type.getName()) 
     .getResultList(); 
    return result; 
} 
1

cách Alternative:

Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class); 
List<Person> rows = query.getResultList(); 
Các vấn đề liên quan