2011-08-23 71 views
2

我是Play和Hibernate的新手,正在开发一个项目。我喜欢它迄今!如何使用Play,MySQL和Hibernate自定义查询ManyToMany表?

我遇到了一个新的问题最近。我有一张桌子。然后,我在该类中引用了一个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如何管理关系。

+0

什么问题?如果您问的是JPQL是使用Hibernate执行请求的方式,则答案为是。如果你问连接表是否必须映射为实体,答案是否定的。阅读hibernate参考文档:解释它。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional –

回答

1

表姐的关系是有点奇怪becaue这纯粹是对称的:如果A是B的表弟,那么B也为A.

的表弟这是一个经典的学生,课程的关系,其中每个不同关系方有不同的作用。

必须,但是,觉得作为一个roleA-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 

想想而言角色而不是表格,它会变得更容易。考虑表妹是一个孩子,还是一个人作为父母,这可能是一个好主意,因为它使得这个关联不对称并且使得这个角色更加明显。

+0

谢谢你的解释。 – user908360