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 :

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>
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
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();
    }
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...

Une idée?