J'ai le problème suivant. J'ai trois classes, A, B et C. A contient une liste de B: s: S. B contient une relation de plusieurs-éléments à C. C contient un champ appelé "nom" et B contient également un champ appelé "nom". Ce que j'aimerais accomplir, c'est avoir les éléments de la liste des articles triés principalement par le nom de C et le nom de B de B - Le problème est que je ne sais pas comment faire cela. Est-ce même possible?
J'utilise Eclipselink comme fournisseur de JPA. P> éditer
Oui, j'ai essayé différentes variations, par exemple @orderby ("C.Name") ne fonctionne pas, je viens d'obtenir un message d'erreur me disant que la classe d'entité B ne contient pas de champ appelé "C.Name". p> p>
5 Réponses :
Avez-vous essayé Vous ne devriez pas utiliser "b." Parce qu'il est implici que le @orderby sera effectué sur des colonnes des instances de B sur le tableau B. P> @orderby ("c.name", "nom") code>? p>
Avez-vous essayé:
@OrderBy("c.name ASC", "name ASC")
Ce n'est pas possible. @Orderby n'accepte que les noms de propriété directe / de champs, pas de propriétés imbriquées. Ce qui a du sens, vraiment, parce que la table "C" - selon votre stratégie de récupération peut même ne pas faire partie d'une sélection émise pour extraire votre "B" S. P>
CHSSPLY76 a raison.
Ce que vous pouviez faire est de créer une requête nommée comme celle-ci: p>
Il n'est pas possible dans javax.persistence.ordorderby (comme dites CHSSPLY76), mais quand j'utilisais Hibernate, je construisiez une nouvelle colonne dans la plaine SQL avec formule () Annotation, puis Ordonnez-vous:
class A {
@OneToMany
@OrderBy("orderCol") <---- reference to virtual column
List<B> b;
}
class B {
@ManyToOne
C c;
String name;
@org.hibernate.annotations.Formula(
"( select C_table.name as orderCol from C_table where C_table.id = id )"
) <------------------------------------------ join with plain SQL statment
String orderCol;
}