Je les classes suivantes (simplifiée pour plus de clarté):EJBQL - Comment trier les résultats de la requête par un champ LEFT JOIN
Class Top {
InternationalStringType name;
}
Class InternationalStringType {
List<LocalizedStringType> localizedString;
}
Class LocalizedStringType {
String value;
}
La requête EJBQL suivante permet d'extraire avec succès toutes les instances de Top avec leurs sous-objets peuplé :
SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls
Je voudrais modifier la requête ci-dessus de telle sorte que les résultats sont triés par Top.name.localizedString.value
Quelle est la syntaxe correcte pour ce faire? J'ai essayé la requête suivante mais je reçois « ERREUR: SELECT pour DISTINCT, les expressions ORDER BY doit apparaître dans la liste de sélection »
SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC
Ce ne est pas clair pour moi quoi mettre dans la liste de sélection pour la clause ORDER BY.
Après donner des erreurs pour le « » après l'objet (t), peu importe ce que je mets après la virgule:
SELECT DISTINCT Object(t), Object(nm_ls) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC
Dans le cas où la mise en œuvre pertinente mon JPA est mise en veille prolongée 3.6.4.Final. TIA pour votre aide.
Vous forcez une jointure à locizedString qui est une collection. Cela signifie que pour une seule entité, il y aura X nombre de lignes uniques (une pour chaque localiséeString référencée), qui sont toutes nécessaires pour construire complètement cette entité. Puisque tous les X sont distincts, distincts n'ont pas l'effet que vous voulez - qui est d'obtenir un résultat unique pour votre entité supérieure. JPA exige que chaque ligne lue soit renvoyée sous la forme d'une entité, mais certains fournisseurs JPA peuvent autoriser le filtrage via une API native. – Chris