2010-10-12 36 views
8

Tôi có một ứng dụng Java EE và tôi sử dụng Hibernate. Các đối tượng miền, tôi đã thay đổi List/ArrayList thành Set/HashSet, vì tốt hơn là sử dụng Sets.Hibernate -> ArrayList không thể được truyền tới Set

Nhưng trong thực hiện Đạo của tôi, tôi chạy vào một vấn đề:

public Set<Person> getAllPersons() { 
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 
    Session sess = sessionFactory.getCurrentSession(); 

    Transaction tx = sess.beginTransaction(); 
    @SuppressWarnings("unchecked") 
    Set<Item> items = (Set<Item>) sess.createQuery("from Item").list(); 
    tx.commit(); 

    return items; 
} 

Ở đây tôi nhận được một lỗi:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set 

tôi có thể làm gì để tránh lỗi này?

Cảm ơn bạn trước & Trân trọng.

+3

Bạn có chắc chắn rằng bạn biết sự khác biệt giữa tập hợp và danh sách là gì? Bởi vì không có cách nào là nó 'tốt hơn' để sử dụng một Set. Bạn sử dụng Sets bất cứ khi nào bạn muốn một cá thể đơn lẻ của một đối tượng trong bộ sưu tập của bạn, trong khi bạn có thể có nhiều cá thể của cùng một đối tượng trong một danh sách. – LeChe

Trả lời

21
List<Item> list = sess.createQuery("from Item").list(); 
Set<Item> items = new HashSet<Item>(list); 

sess.createQuery("from Item").list(); sẽ trả về một danh sách hàng loạt các hạng mục kết quả, nếu bạn cần nó trong Set bạn có thể làm cho nó như thể hiện trong mã

+0

hoặc xây dựng lại cơ sở dữ liệu có thể không phải là một lựa chọn – willcodejavaforfood

+0

vấn đề nhỏ, nó phải là 'Đặt mục = new HashSet (danh sách); '. Ngoài ra: +1 –

+0

"xây dựng lại cơ sở dữ liệu mà có thể không phải là một lựa chọn" - Điều này không có ý nghĩa, 'Query.list()' luôn trả về một 'Danh sách': http://docs.jboss.org/hibernate/ stable/core/javadoc/org/hibernate/Query.html # list() –

3

The domain objects, I changed the List/ArrayList to Set/HashSet, because it is better to use Sets.

Nó không phải là "tốt hơn" để sử dụng Set, nó phụ thuộc hoàn toàn về những gì bạn cần. Tuy nhiên, loại bộ sưu tập bạn sử dụng trong đối tượng miền của mình và loại trả lại là Query#list()hai thứ không liên quan.

Cá nhân, tôi không thể nói rằng tôi thấy nhiều giá trị khi chuyển kết quả truy vấn thành Set (ngoài việc ăn nhiều bộ nhớ hơn), trừ khi bạn muốn xóa duplicates from query results tất nhiên (nhưng trong trường hợp đó, tôi sẽ thách thức các ánh xạ).

Bây giờ, nếu bạn nhấn mạnh, việc triển khai Set khác nhau có một hàm tạo có một số Collection (và câu hỏi về cơ bản là bản sao của Easiest way to convert a List to a Set? - Java).

+0

Khi tôi cần trợ giúp với JPA/HSQL, bạn không có nơi nào để xem, nhưng bạn xuất hiện! thái quá :) – willcodejavaforfood

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