À l'aide de mot-clé DISTINCT en JPA sur des colonnes
Je suis en train de lire quelques valeurs à partir d'une base de données qui est horriblement onu-normalisées (dont je ne contrôle pas). L'appel récupère les annonces pour les départements de l'université, et si un utilisateur est dans plusieurs départements (ce qui est possible), alors les mêmes résultats sont retournés plusieurs fois pour ces utilisateurs. Toutefois, certains départements peuvent avoir différentes annonces, tandis que certains ont le même.
Est-il un moyen pour moi d'utiliser le mot clé DISTINCT dans JPA sur des colonnes? C'est ce que j'ai actuellement pour la requête:
String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement "
+ "WHERE (announcement.date <= :now AND announcement.endDate >= :now) "
+ "AND announcement.approved = true AND announcement.departmentId IN (:departmentIDs)";
TypedQuery<Announcement> query = entityManager.createQuery(jpql,
Announcement.class);
query.setParameter("now", new Date());
query.setParameter("departmentIDs", departmentIDs);
La departmentID valeur peut être différent, mais l'annonce, les dates, etc. sont tous identiques. Cette requête renvoie les annonces qui ont des valeurs en double.
Hibernate 3.6.6 et hibernate-jpa-2.0-api-1.0.1.Final.jar
OriginalL'auteur acvcu | 2012-02-10
Vous devez vous connecter pour publier un commentaire.
deux façons j'venir avec votre problème:
"select distinct annonce.x, annonce.y annonce.z
...(sans depId) à partir de..."
puis de construire une annonce. mais vous
perdu la persistance de l'objet et de ses références. vous devez les charger
encore les objets Dao si vous avez besoin d'.
remplacer equals() [hashCode ()] dans votre Annonce de classe, de
bien sûr, dans equals(), depId devrait être hors de la comparaison. arriver
la liste que vous avez fait, puis de convertir la liste. vous avez
"Distinct" objets
espère que cela aide
OriginalL'auteur Kent
À mon avis une meilleure approche est de retourner un objet spécifique contenant uniquement les colonnes qui vous intéressent. Voir aussi la réponse suivante:
JPQL Constructeur Expression - org.mise en veille prolongée.hql.ast.QuerySyntaxException:le Tableau n'est pas mappé
Selon votre exemple, vous pourriez créer un nouvel Objet avec uniquement les colonnes qui vous intéressent:
OriginalL'auteur finrod