Ответ 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
}