使用JPA EntityManager加入两个不相关的表

时间:2012-03-28 16:13:37

标签: java jpa jpa-2.0

当两者之间没有FK / PK关系时,我需要在属性上加入两个JPA实体。 我正在使用Hibernate,可以像这样使用HQL查询

 select foo, bar from FooEntity as foo, BarEntity as bar
 where  foo.someothercol = 'foo' and foo.somecol = bar.somecol

但是,我想避免依赖Hibernate并使用EntityManager。 请帮忙。

1 个答案:

答案 0 :(得分:19)

您的查询是有效的JPQL,并且不使用Hibernate特定功能(只缺少bar和from之间的空格)。在JPA 2.0规范(4.4.5联接)中,用以下单词解释:

  

可以通过使用笛卡尔隐式指定内连接   FROM子句中的产品和WHERE子句中的连接条件。   在没有连接条件的情况下,这会减少为笛卡儿   产品。

     

这种广义联接方式的主要用例是何时   连接条件不涉及外键关系   映射到实体关系。示例:SELECT c FROM Customer c,

     

员工e WHERE c.hatsize = e.shoesize

您的查询的主要区别在于您的选择包含两种类型的实体。查询结果是List of Object []。数组中元素的顺序与select中的相同 声明。以下是您的案例:

String query =
    "select foo, bar from  FooEntity as foo, BarEntity as bar "+
    "where  foo.someothercol = 'foo' and foo.somecol = bar.somecol";
List<Object[]> results = em.createQuery(query).getResultList();

for (Object[] fooAndBar: results) {
    FooEntity foo = (FooEntity) fooAndBar[0];
    BarEntity bar = (BarEntity) fooAndBar[1];
    //do something with foo and bar
}