Как сделать пользовательский запрос к таблице ManyToMany, используя Play, MySQL и Hibernate? - PullRequest
2 голосов
/ 23 августа 2011

Я новичок в Play и Hibernate и работаю над проектом. Я люблю это до сих пор!

Недавно я столкнулся с новой проблемой. У меня есть таблица людей. Затем в этом классе у меня есть отношение ManyToMany, которое ссылается на себя. Таким образом, Hibernate прекрасно создает эту таблицу, и у меня есть peopleid1 и peopleid2, и люди могут иметь отношения со всеми другими людьми и наоборот.

Теперь мне нужно выполнить несколько сложных запросов к этой таблице, и у меня возникли некоторые проблемы, так как я хочу сделать это в своем собственном классе, но не уверен, что это лучший способ сделать это или использовать hibernate. Является ли JPQL ответом? Любая помощь или мысли приветствуются!

Давайте использовать двоюродных братьев в качестве примера. У меня есть человек класса / модели, и у этих людей есть двоюродные братья и сестры. Прямо сейчас у меня есть это в моем коде:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "Cousins",
   joinColumns = { @JoinColumn(name = "personid") },
   inverseJoinColumns = { @JoinColumn(name = "cousinid") })
public Set<User> cousins;

Это прекрасно работает и прекрасно создает объединяющую таблицу, и я могу вводить данные и тому подобное, как и ожидалось. Тем не менее, я застрял, пытаясь написать функцию. Я могу найти всех людей, которые вошли в систему Person, имеют двоюродных братьев, но не могут найти всех, где зарегистрированный пользователь является двоюродным братом. Я думаю, что это правильный способ сделать это, но я очень склонен просто сделать кузенов своим собственным классом / моделью, и когда я делаю так, вещи работают, но я не уверен, как тогда Hibernate будет управлять отношениями.

1 Ответ

1 голос
/ 24 августа 2011

Отношения кузена немного странные, потому что они чисто симметричные: если A является двоюродным братом B, то B также является двоюродным братом A.

Это отличается от классических отношений Student-Course, гдекаждая сторона отношений имеет различную роль.

Однако вы должны рассматривать отношения кузена как отношения roleA-roleB.Вы можете определить его как личность двоюродного брата, который указывает на человека, а двоюродный брат указывает на двоюродного брата.Итак, если вы хотите сказать, что у человека A есть двоюродный брат B, у вас должен быть кортеж aId-bId в таблице соединений.Если вы также хотите сказать, что у человека B есть двоюродный брат A, у вас должен быть кортеж bId-aId в таблице соединений.

Таким образом, HQL для поиска всех двоюродных братьев этого человека выглядит следующим образом:

 select cousin from People person inner join person.cousins cousin where person.id = :personId

HQL, чтобы найти всех двоюродных братьев и сестер, таков:

select person from People person inner join person.cousins cousin where cousin.id = :cousinId

Думайте с точки зрения ролей, а не с точки зрения таблицы, и это станет намного проще,Думать о двоюродном брате как о ребенке и о человеке как о родителе, возможно, хорошая идея, потому что это делает ассоциацию ассиметричной и делает роли более очевидными.

...