2012-03-28 65 views
14

当两者之间没有FK/PK关系时,我需要在属性上连接两个JPA实体。 我使用Hibernate和可以使用HQL这样的查询使用JPA EntityManager加入两个不相关的表格

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

但是,我想,以避免对Hibernate的依赖和使用的EntityManager来代替。 请帮忙。

回答

19

您的查询是有效的JPQL,并没有使用Hibernate特定的功能(只是空间和酒吧之间缺少)。在JPA 2.0规范(4.4.5加入)这是与以下说明的话:

内连接可以通过使用笛卡尔 产物被隐式地指定在FROM子句和WHERE子句中连接条件。 在没有连接条件的情况下,这会减少到产品的直角坐标 。

这种广义式连接的主要用例是当 连接条件不涉及映射到实体关系的 外键关系。例如:选择c从客户C,

员工e其中c.hatsize = e.shoesize

到您的查询的主要区别是,你的选择包含两种类型的实体。查询的结果是对象[]的列表。阵列中元素的顺序与选择 声明中的顺序相同。以下作品在你的情况下:

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 
} 
+0

酒吧之间的空间不足,并终止! – 2016-10-28 01:20:08