Bonjour,
je vous présente une petit problème d'optimisation :
J'ai une table User et une table Game. Entre les deux, une many-to-many, appellée Player, définie comme suit :
Donc, l'objectif est maintenant d'aller chercher dans la base toutes les parties auxquelles un User est associé via cette table Player. Voici mon code DAO non optimisé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <class name="Player" table="Player"> <id name="id" column="id"> <generator class="native"/> </id> <property name="status"/> <many-to-one name="user" column="login" class="User"/> <many-to-one name="game" column="gameId" class="Game"/> (...) </class>
Ce code fonctionne, mais me crée deux jointures : une Game-Player, et une seconde Player-User. C'est une de trop puisqu'on connait l'identifiant de User (=login) qui est la clé étrangère de la table Player. Il suffirait alors de pouvoir mettre la restriction sur c2 plutôt que sur c3. Mais c'est là qu'est le soucis : le mapping de Player ne définit pas de "propriété" login...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public List<Game> getUserGames(String login) { /* SELECT * FROM GAME g, PLAYER p WHERE p.gameId = g.gameId and p.login = login */ Criteria c1 = getSession().createCriteria(Game.class); Criteria c2 = c1.createCriteria("players"); Criteria c3 = c2.createCriteria("user"); c3.add(Restrictions.eq("login", login)); return c1.list(); }
Une idée?
Partager