2010-10-12 17 views
8

Ho un'applicazione Java EE e utilizzo Hibernate. Gli oggetti del dominio, ho modificato List/ArrayList su Set/HashSet, perché è meglio usare Sets.Hibernate -> ArrayList non può essere lanciato su Set

Ma nella mia implementazione Dao mi imbatto in un problema:

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; 
} 

Qui ho un errore:

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

Cosa posso fare per evitare questo errore?

Grazie in anticipo & I migliori saluti.

+3

Sei sicuro di sapere qual è la differenza tra un set e un elenco? Perché in nessun modo è "meglio" usare un Set. Puoi usare Sets ogni volta che vuoi una singola istanza di un oggetto nella tua collezione, mentre puoi avere più istanze dello stesso oggetto in una lista. – LeChe

risposta

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

sess.createQuery("from Item").list(); restituirà una lista di array di elementi risultanti, se ne avete bisogno in Set si può fare, come mostrato nel codice

+0

o ricostruire il database che potrebbe non essere un problema secondario – willcodejavaforfood

+0

, dovrebbe essere 'Set items = new HashSet (lista);'. A parte questo: +1 –

+0

"ricostruire il database che potrebbe non essere un'opzione" - Questo non ha senso, 'Query.list()' restituisce sempre un 'Elenco': 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.

non è "migliore" per usare Set, dipende interamente su quello che ti serve. Tuttavia, il tipo di raccolta utilizzato negli oggetti del dominio e il tipo di reso di Query#list() sono due cose non correlate.

Personalmente, non posso dire che vedo molto valore nel convertire il risultato di una query in un Set (a parte mangiare più memoria), a meno che non si vuole esplicitamente rimuovere duplicates from query results ovviamente (ma in quel caso, io metterebbe in discussione le mappature).

Ora, se si insiste, le varie implementazioni Set hanno un costruttore che accetta uno Collection (e la domanda è essenzialmente un duplicato di Easiest way to convert a List to a Set? - Java).

+0

Quando ho bisogno di aiuto con JPA/HSQL non si vede da nessuna parte, ma tu appari! oltraggioso :) – willcodejavaforfood

Problemi correlati