使用 JPA EntityManager 联接两个不相关的表

2022-09-04 02:15:01

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

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

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


答案 1

您的查询是有效的 JPQL,并且不使用特定于 Hibernate 的功能(缺少 bar 和 from 之间的空格)。在 JPA 2.0 规范(4.4.5 连接)中,用以下文字对此进行了解释:

可以通过在 FROM 子句中使用笛卡尔积和在 WHERE 子句中使用连接条件来隐式指定内连接。在没有连接条件的情况下,这简化为笛卡尔积。

这种通用连接样式的主要用例是当连接条件不涉及映射到实体关系的外键关系时。例:SELECT c FROM Customer c, Employee e WHERE c.hatsize = e.shoesize

与查询的主要区别在于,您的选择包含两种类型的实体。查询的结果是对象列表[]。数组中元素的顺序与 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
}

答案 2

推荐