如何使用Play,MySQL和Hibernate自定义查询ManyToMany表?

时间:2011-08-23 19:48:12

标签: mysql hibernate jpa playframework jpql

我是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;

这很好用,可以完美地创建连接表,我可以按预期输入数据。但是,我试图编写一个函数。我可以找到登录的人有堂兄弟的所有人,但找不到登录用户是堂兄的所有人。我认为这是正确的方法,但我非常倾向于让Cousins成为它自己的类/模型,当我这样做的时候工作但是我不确定Hibernate将如何管理这些关系。

1 个答案:

答案 0 :(得分:1)

堂兄的关系有点奇怪,因为它纯粹是对称的:如果A是B的堂兄,那么B也是A的堂兄。

这与传统的学生 - 课程关系不同,关系的每一方都有不同的角色。

但是,您必须将堂兄关系视为角色A-roleB关系。你可以将它定义为person-cousin personId指向该人,而cousinId指向表兄。所以,如果你想说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

考虑角色而不是表格,它会变得更容易。一个表弟作为一个孩子和一个人作为父母的想法也许是一个好主意,因为它使得协会不对称并使角色更加明显。