2017-08-31 1 views
1

J'essaie de trier la liste d'objet parent par la valeur de son enfant qui est un ensemble. Alors disons que je ff:Tri d'un objet parent par la valeur de son ensemble enfant

Parent1 avec le nom des enfants rose
Parent2 avec le nom des enfants camée
Parent3 avec le nom des enfants de abba, Zeon, max.

Lorsque je le trier en descendant, il doit afficher Parent3 en premier, car il a un z. Ceci est mon hql courant qui obtient un mauvais résultat de 1> 2> 3:

SELECT DISTINCT p FROM Parent p JOIN p.children c ORDER BY c.name desc 

Sans distincte, il obtient très bien même si elle sélectionne plusieurs mêmes parents.

J'ai une configuration de modèle comme ci-dessous:

public class Parent { 
private Set<Child> children = new HashSet<Child>(); 
} 

public class Child{ 
    private String name; 

} 

Edit: Réussi à trier HQL order by within a collection bien que lorsque les deux parents ont la même valeur children.name, il ne compare pas la prochaine valeur possible. C'est à dire.

Si Parent1 a des enfants abba, Zeon
Parent2 a des enfants abba, camée
Ordre ascendant devrait donner la priorité Parent2 premier.

+1

On dirait que cela a déjà été répondu dans [hql-order-by-within-a-collection] (https://stackoverflow.com/questions/666423/hql-order-by-within-a-collection) help –

+0

@Jorge Merci pour ce travail bien que si les deux parents ont la même valeur children.name il ne compare pas la valeur du nom suivant ie tous deux ont un enfant nommé acacia en supposant l'ordre ascendant il comparera la valeur suivante jusqu'à ce qu'il trouve la première valeur possible il y a – Rian

Répondre

0

Si vous ne voulez pas la duplication du parent, vous ne pouvez pas le faire avec une collection. Ce que vous pouvez faire est de sélectionner le parent et sous-sélectionner l'élément max (alphabétique) dans chaque parent et l'ordre par lui.

Quelque chose autour de ces lignes.

select p from Parent p 
where p.maxChild = 
    (select max(c.name) from Child c where c.parentID=p.parentID) 

Vous pouvez utiliser @Formula pour mapper l'élément max si vous voulez. Il n'est donc pas vraiment nécessaire d'utiliser une collection.

Actuellement, il peut être encore mieux avec la formule, vous pouvez mapper le nom maximum et l'ordre directement par lui sans aller chercher la collection du tout.