2010-10-12 6 views
8

J'ai une application Java EE et j'utilise Hibernate. Les objets de domaine, j'ai changé le List/ArrayList à Set/HashSet, parce qu'il est préférable d'utiliser des ensembles.Hibernate -> ArrayList ne peut pas être converti en Set

Mais dans ma mise en œuvre de Dao je rencontre un problème:

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

Ici je reçois une erreur:

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

Que puis-je faire pour éviter cette erreur?

Merci d'avance & Cordialement.

+3

Etes-vous sûr de savoir quelle est la différence entre un ensemble et une liste? Parce qu'il n'est en aucun cas «préférable» d'utiliser un Set. Vous utilisez des ensembles chaque fois que vous voulez une instance unique d'un objet dans votre collection, alors que vous pouvez avoir plusieurs instances du même objet dans une liste. – LeChe

Répondre

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

sess.createQuery("from Item").list(); renvoie une liste de tableau d'éléments résultants, si vous avez besoin dans Set vous pouvez le faire comme indiqué dans le code

+0

ou reconstruire la base de données qui pourrait ne pas être une option – willcodejavaforfood

+0

problème mineur, il devrait être 'Set items = new HashSet (liste);'. En dehors de cela: +1 –

+0

"reconstruire la base de données qui pourrait ne pas être une option" - Cela n'a aucun sens, 'Query.list()' renvoie toujours une 'List': 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.

Ce n'est pas « meilleur » à utiliser Set, il dépend entièrement sur ce dont vous avez besoin. Mais de toute façon, le type de collection que vous utilisez dans vos objets de domaine et le type de retour de Query#list() sont deux choses sans rapport.

Personnellement, je ne peux pas dire que je vois beaucoup de valeur dans la conversion du résultat d'une requête en Set (en dehors de manger plus de mémoire), sauf si vous voulez explicitement supprimer duplicates from query results bien sûr (mais dans ce cas, je défierait les cartographies). Maintenant, si vous insistez, les différentes implémentations Set ont un constructeur qui prend un Collection (et la question est essentiellement un doublon de Easiest way to convert a List to a Set? - Java).

+0

Quand j'ai besoin d'aide pour JPA/HSQL, vous ne pouvez pas être vu, mais vous apparaissez! scandaleux :) – willcodejavaforfood

Questions connexes