gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:11:43 25 4
gpt4 key购买 nike

我是 Play 和 Hibernate 的新手,正在从事一个项目。到目前为止,我喜欢它!

我最近遇到了一个新问题。我有一 table 人。然后我在那个引用自身的类中有一个 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 将如何管理这些关系。

最佳答案

表亲关系有点奇怪,因为它是完全对称的:如果 A 是 B 的表亲,那么 B 也是 A 的表亲。

这与传统的学生-类(class)关系不同,在传统的学生-类(class)关系中,关系的每一方都扮演着不同的角色。

但是,您必须将表亲关系视为 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

根据角色而不是表格来思考,这会变得容易得多。将表亲视为 child ,将某人视为 parent 也许是个好主意,因为这会使联想变得不对称,并使角色更加明显。

关于mysql - 如何使用 Play、MySQL 和 Hibernate 自定义查询 ManyToMany 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7166703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com