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

标签 mysql hibernate jpa playframework jpql

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

相关文章:

java - 我对 Hibernate 感到困惑?

mysql更新~比select慢25倍。是否正常?

java - 如何有条件地加载映射到对象中的集合?

java - LocalDateTime JPA - Java 8

java - 如何获取 @ElementCollection map 的相关表

java - 在 Hibernate 中使用注释映射坐标的 Hashmap

jpa - Quarkus 依赖注入(inject) JPA 实体管理器的问题

mysql - 根据CustomerID计算总和

php - CakePHP Fetch Assoc 相当于打印数组中的值?

mysql - 无法通过命令行导入sql文件