如何获取多对多关系实体

时间:2015-09-15 16:43:06

标签: java mysql hibernate postgresql jpa

我有以下表结构

TABLE1
  T1_ID
  T1_Col1

TABLE2
  T1_ID
  T3_ID

TABLE3
  T3_ID
  T3_COL1

Table1Table3由中间表Table2连接。现在我只有T1_ID,我想要从Table3获取与T1_ID相关联的所有行。一个简单的SQL查询将是

select T1.*, T3.* 
from TABLE1 T1, TABLE T2, TABLE3 T3
where T1.T1_ID = T2.T1_ID
and T2.T3_ID = T3.T3_ID

那么我怎样才能在hibernate / jpa中执行此操作...我还没有编写Table1Table2Table3的实体类。我想在Table1中执行此查询,以便我可以编写一个方法entity.fetchAssociatedTable3()。我能想到的最简单的方法是fetchAssociatedTable3我可以像上面提到的那样放置自定义查询。但是因为我正在使用hibernate / jpa,我想知道是否有更好的方法来做到这一点。

更新 显然,我的问题还不够清楚。我想做一些用户Dragan Bozanovic提到的事情。但是,我想知道的是什么

  1. 我如何写Table1实体?我的意思是我会在列等上添加哪些注释,这将使hibernate / jpa了解此列通过Table3

  2. Table2列相关
  3. 我想如果回答问题1,那么编写getEntity3s()方法就很困难了。但如果(对于一个菜鸟)有一些我需要知道的东西,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

假设您在Entity1(映射到TABLE1)和Entity3(映射到TABLE3)之间存在多对多关联,您可以:

1)按ID读取Entity1并从中获取所有Entity3

Entity1 entity1 = entityManager.find(Entity1.class, entity1Id);
Collection<Entity3> entity3s = entity1.getEntity3s();

2)或者,执行JPQL查询以获取Entity3而不加载Entity1实例:

select distinct e3 from Entity3 e3 join Entity1 e1 where e1.id = :entity1Id

答案 1 :(得分:0)

您需要做的第一件事是在使用ORM工具(Hibernate / JPA)时不再考虑表格。您为类及其关系建模,让ORM工具以声明方式帮助映射。您的联接表只是在这里用于创建两个实体之间的多对多关系。所以在类方面你只有Entity1和Entity3。您不会创建表示连接表的类(除非您希望它具有除外键之外的其他属性,在这种情况下,它将有资格成为其自身的实体类)。然后你可以使用@Dragan建议的任何一种方法,即通过主键加载或使用显式的HQL / JPQL。