Соедините две несвязанные таблицы, используя JPA EntityManager - PullRequest
14 голосов
/ 28 марта 2012

Мне нужно объединить два объекта 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 Ответ

19 голосов
/ 28 марта 2012

Ваш запрос является допустимым JPQL и не использует специфические функции Hibernate (пропущен только пробел между строкой и от). В спецификации JPA 2.0 (4.4.5 Joins) это объясняется следующими словами:

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

Основным вариантом использования этого обобщенного стиля объединения является случай, когда условие соединения не предполагает отношения внешнего ключа, которое сопоставлены с отношениями сущности. Пример: ВЫБРАТЬ c ОТ клиента c,

Сотрудник e ГДЕ 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...