2015-06-24 2 views
2

Были обучение Hibernate, Spring и JPA на прошлой неделе и застрял на том, чтобы создать критерии для следующего сценария:Hibernate Критерии с автообъединение

Скажем, у меня есть 2 таблицы:

игры

  • ID

PlayedGame

  • ID
  • account_ref -> ссылка на некоторую таблицу счета
  • game_id -> Ссылка на игру отображение

Entity:

Game { 

@id 
Long id; 

@OneToMany(mappedBy = "game") 
Set<Player> players; 

} 

PlayedGame { 

@id 
Long id; 

Long account_ref; 

@ManyToOne 
@JoinColumn(name = "game_id", referencedColumnName = "id") 
Game game; 
} 

Теперь я хочу, чтобы запросить для следующего сценария: - Я хочу найти все игры определенного игрока (P) играл, где игрок (A) был его частью. Более конкретно, что два человека, принадлежащих к одной и той же игре

В SQL это можно было бы сделать что-то вроде (что запрос должен быть):

SELECT DISTINCT p1.* FROM Player as p1 
INNER JOIN Player as p2 ON p1.game_id=p2.game_id 
WHERE p1.account_ref=P AND p2.account_ref=A 

Может ли это быть сделано аккуратно с критериями в Hibernate?

+0

Зависит от ваших сопоставлений сущностей и, поскольку вы их не разместили ..... –

+0

Создал привязку объекта сейчас – mrmjauh

+0

Друг-часть очень неоднозначна, вы говорите, что два человека, принадлежащих к одной игре? – Mudassar

ответ

1

Возможно, возможно с API-интерфейсом Hibernate, но не прямо.

Простой случай требует того же пути ассоциации будет присоединяться два раза (один для и один для 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(); 

Это не будет работать из-за HHH-879.

Но вы можете использовать запрос 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(); 

Это даже меньше кода.

Также: Некоторые считают API критериев deprecated.

+0

Спасибо, что поняли, привет! – mrmjauh

Смежные вопросы