Mise en veille prolongée -> ArrayList ne peut pas être jeté à Set
-
29-09-2019 - |
Question
J'ai une application Java EE et j'utilise Hibernate. Les objets de domaine, j'ai changé la liste / ArrayList Set / HashSet, car il est préférable d'utiliser des ensembles.
Mais dans ma mise en œuvre 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, j'obtiens une erreur:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set
Que puis-je faire pour éviter cette erreur?
Merci à l'avance et meilleures salutations.
La solution
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
Autres conseils
Les objets de domaine, j'ai changé la liste / ArrayList Set / HashSet, car il est préférable d'utiliser des ensembles.
Il est pas « meilleur » à l'utilisation Set
, cela dépend entièrement de ce que 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 avec .
Personnellement, je ne peux pas dire que je vois beaucoup de valeur à convertir le résultat d'une requête dans un Set
(en dehors de manger plus de mémoire), sauf si vous voulez explicitement supprimer doublons à partir des résultats de la requête bien sûr (mais dans ce cas, je conteste les correspondances).
Maintenant, si vous insistez, les différentes implémentations de Set
ont un constructeur qui prend un Collection
(et la question est essentiellement un double de pour convertir manière la plus simple d'une liste à un ensemble - Java )