sql >> Base de Datos >  >> RDS >> Mysql

Criterios de Hibernate con autounión

Tal vez sea posible con la API Criteria de Hibernate, pero no es sencillo.

Un caso simple requeriría que la misma ruta de asociación se uniera dos veces (una para A y uno para P ):

Criteria gameCriteria = ((HibernateEntityManager) em).getSession().createCriteria(Game.class);

Criteria playedGamesOfACriteria = gameCriteria.createCriteria("playedGames", "pga");
Criteria accountOfACriteria = playedGamesOfACriteria.createCriteria("account", "a");
accountOfACriteria.add(Restrictions.idEq(a.id));

Criteria playedGamesOfPCriteria = gameCriteria.createCriteria("playedGames", "pgp");
Criteria accountOfPCriteria = playedGamesOfPCriteria.createCriteria("account", "p");
accountOfPCriteria.add(Restrictions.idEq(p.id));

return gameCriteria.list();

Esto no funcionará debido a HHH-879 .

Pero puedes usar una consulta JPA:

Query q = em.createQuery(
        "select g "
        + "from Game g "
        + "join g.playedGames pga "
        + "join pga.account a "
        + "join g.playedGames pgp "
        + "join pgp.account p "
        + "where a = ?1 and p = ?2"
);
q.setParameter(1, a);
q.setParameter(2, p);
return q.getResultList();

Esto es aún menos código.

Además:algunos consideran que la API de criterios es obsoleto .