Присоедините две несвязанные таблицы, используя JPA EntityManager

Мне нужно объединить два объекта JPA в свойстве, если между ними нет отношения FK/PK. Я использую Hibernate и могу использовать 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 функции (просто пробел между баром и отсутствующим). В спецификации JPA 2.0 (4.4.5 Joins) это объясняется следующими словами:

Внутреннее объединение может быть неявно задано с помощью декартовой продукт в предложении FROM и условие соединения в предложении WHERE. В отсутствие условия соединения это сводится к декартовому продукт.

Основной прецедент для этого обобщенного стиля объединения - это когда условие объединения не связано с отношением внешнего ключа, которое сопоставлены с отношением сущности. Пример: SELECT c FROM Клиент c,

Сотрудник e WHERE c.hatsize = e.shoesize

Основное отличие вашего запроса состоит в том, что ваш выбор содержит два типа объектов. Результатом запроса является List of Object []. Порядок элементов в массиве такой же, как при выборе выражение. Следующие работы в вашем случае:

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
}