2010-10-12 15 views
8

Tengo una aplicación Java EE y uso Hibernate. Los objetos del dominio, cambié List/ArrayList a Set/HashSet, porque es mejor usar Sets.Hibernate -> ArrayList no se puede convertir a Set

Pero en mi aplicación Dao me encuentro con 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; 
} 

Aquí me sale un error:

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

¿Qué puedo hacer para evitar este error?

Gracias de antemano & Atentamente.

+3

¿Estás seguro de que sabes cuál es la diferencia entre un conjunto y una lista? Porque de ninguna manera es 'mejor' usar un Set. Utiliza Sets siempre que desee una instancia única de un objeto en su colección, mientras que puede tener varias instancias del mismo objeto en una lista. – LeChe

Respuesta

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

sess.createQuery("from Item").list(); devolverá una lista variedad de artículos resultantes, si lo necesita en el juego se puede hacer como se muestra en el código

+0

o reconstruir la base de datos que podría no ser una opción – willcodejavaforfood

+0

problema menor, debe ser 'Establecer elementos = nuevo HashSet (lista);'. Además de eso: +1 –

+0

"reconstruir la base de datos que podría no ser una opción" - Esto no tiene sentido, 'Query.list()' siempre devuelve una 'Lista': http://docs.jboss.org/hibernate/ estable/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.

No Es "mejor" para usar Set, que depende enteramente en lo que necesitas Pero de todos modos, el tipo de colección que usa en sus objetos de dominio y el tipo de devolución de Query#list() son dos cosas no relacionadas.

Personalmente, no puedo decir que veo mucho valor en convertir el resultado de una consulta en Set (aparte de consumir más memoria), a menos que explícitamente desee eliminar duplicates from query results por supuesto (pero en ese caso, yo desafiaría las asignaciones).

Ahora, si insiste, las diversas implementaciones Set tiene un constructor que toma un Collection (y la cuestión es esencialmente un duplicado de Easiest way to convert a List to a Set? - Java).

+0

Cuando necesito ayuda con JPA/HSQL, no se te ve por ningún lado, ¡pero apareces! indignante :) – willcodejavaforfood

Cuestiones relacionadas