Je ne peux pas utiliser le tri sur des tables de jointure. Laissez-moi vous expliquer;
J'ai trois tables. Utilisateurs, rôles et user_roles.
Mes entités JPA sont utilisateur, userrole, userrolePk, rôle. p> en fait la sortie que je veux est la suivante:
"Sélectionnez * à partir d'user_roles ur les utilisateurs u sur u.id = ur.userid ordre par u.name;" p> donc j'essaie d'utiliser des critères Hibernate API. P> CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.addOrder(Order.asc("pk.user.name"));
List userRoles = criteria.list();
3 Réponses :
Eh bien, tout d'abord, je pense que nous devrions voir vos entités mappings (classes Java)
D'autre part, je supposerai que votre classe USerrole a une référence à une instance utilisateur. P>
List<UserRole> userRoles = getRolesWithUser();
for (UserRole role:userRoles){
User user = role.getUser();
//do something with role , user
}
Dans user_roles Table, les colonnes et les colonnes pilidées sont des clés primaires. J'ai donc utilisé une clé embarquée et une classe supplémentaire (USERRELEPK) pour IT.USERRolePK a une cartographie correcte.
Tout à fait facile, utilisez simplement Createcriteria sur les associations:
Criteria c=session.createCriteria(User.class)
.createCriteria("roles")
.add(Restrictions.eq("name","test")
.list();
Il n'y a pas beaucoup de bien à de nombreuses propriétés de relation telles que des rôles dans l'entité utilisateur. Au lieu de cela, j'ai utilisé une entité USERROLE.
Si une classe fait référence à d'autres classes, vous ne pouvez pas simplement accéder à leurs propriétés dans des restrictions et des commandes. Vous devrez créer un alias pour les objets référencés, puis utiliser l'alias pour définir des restrictions et des commandes sur les autres objets.
Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.createAlias("pk", "a1");
criteria.createAlias("a1.user", "a2");
criteria.addOrder(Order.asc("a2.name"));
List userRoles = criteria.list();
Semble bien mais ça n'a pas fonctionné. Colonne inconnue 'A2X2_.Name' dans "clause de commande" et il s'agit de la requête SQL générée par des critères API. __ "Sélectionnez ceci_.roléid en tant que rôleID614_0_, this_.userid comme userid614_0_ de user_roles this_ commande par a2x2_.name ASC" __
Peut-être qu'il y a quelque chose qui ne va pas avec la cartographie. La création d'un alias doit normalement rejoindre la table, si la propriété est une relation plusieurs à une. Vos graphiques de table ne contiennent aucune relation de relations. Peut-être que vous devriez les ajouter ou ajouter la cartographie à la question.