Как сказал Кен Чан, вы не можете сделать это напрямую в одном запросе HQL.
Относительно ваши трех возможностей:
- Native SQL: Не рекомендуется. Синтаксис внешних соединений довольно различен между различными базами данных.
- Добавить отношения: Это то, что я хотел бы сделать. Это не дорогого кода или памяти, и это быстро запрограммировано.
- Внутреннее соединение: это не работает (недостающие строки), если отношение действительно является внешним соединением в базе данных.
Если какими-то особыми причинами вы действительно не хотите, чтобы добавить отношение, вы можете разбить запрос на два отдельных запросов и присоединиться результат вручную в Java, например, как это:
Query qa = session.createQuery("from A a");
List la = qa.list();
Query qb = session.createQuery("select distinct b.* from B b, A a where a.some=b.some");
List lb = qb.list();
Map bMap = new HashMap();
for (B b : lb) {
bMap.put(b.getId(), b);
}
/* example with for loop */
for (A a : la) {
B b = bMap.get(a.getForeignKeyForB());
/* now you have A a and the outer joined B b and you can do with them what you want */
...
}
Это решение имеет (почти) ту же стоимость во время выполнения и памяти как внешнее соединение в базе данных (решение 2.). Это всего лишь несколько java-код.
(Решение аналогично эта предложенный Кен Чан, но он избегает «не» и внутреннего выбора, который и может быть неэффективным в базе данных.)
Кристалл острым. Благодаря! –
Не могли бы вы указать на источник синтаксиса новой опции «join on»? Я попробовал «SELECT a FROM A a LEFT JOIN B b ON a.x = b.y' и все еще получил« org.hibernate.hql.internal.ast.QuerySyntaxException: путь, ожидаемый для соединения! ». (Я добавил 'hibernate-core' версию 5.1.0.Final к моему файлу maven pom, другие артефакты, которые я буду в более старых версиях. Но когда я прочитал [HHH-16] (https://hibernate.atlassian.net/projects/ HHH/issues/HHH-16? Filter = allissues & orderby = votes + DESC% 2C + priority + DESC% 2C + updated + DESC), этого должно быть достаточно.) – Joe7
Спасибо за обновление и указатель на закрытую проблему. –