Hibernate Left Outer Join проблема: ожидается путь при соединении - PullRequest
5 голосов
/ 12 октября 2010

У меня есть две таблицы, что-то вроде:
Article и ArticleRelevance
Они имеют отношение один к одному, и ArticleRelevance является необязательным, означая, что Article может (или не может) иметь ArticleRelevance.

Я хочу выбрать все статьи вместе с деталями ArticleRelevance.

В традиционном SQL я буду выполнять внешнее объединение таблиц, например

SELECT *
FROM ARTICLE A LEFT OUTER JOIN ARTICLE_RELEVANCE AR ON A.ARTICLE_ID = AR.ARTICLE_ID

Я пробовал аналогичный запрос в HQL и получил исключение с сообщением "Path Expected for Join"

Я не могу понять это сообщение.Что это значит и как мне это решить?

(как вы, наверное, уже догадались). Я новичок в спящем режиме.

У меня есть для использования HQL,На самом деле у меня уже есть HQL, объединяющий две или три таблицы, и я должен добавить это условие.

StringBuffer hql = new StringBuffer();
hql.append(" select new service.orders.Order (order.orderNo, article.articleNo, article.articleName)");
hql.append(" from (Order order join  Article article with order.articleNo = article.articleNo) left outer join  ArticleRelevance articleRelevance with article.articleNo = articleRelevance.articleNo");
hql.append(" and order.orderNo =  "+orderNumber);

На этом форуме кто-то говорит, что это "недостающая функциональность".Правда?

1 Ответ

8 голосов
/ 12 октября 2010

Я пробовал аналогичный запрос в HQL и получил исключение с сообщением «Ожидается путь для соединения»

В HQL [ LEFT [OUTER] | INNER ] JOIN выполняется вдоль пути ассоциации (составленного из переменной идентификации, за которой следуют точка и поле ассоциации). Так что-то вроде этого в вашем случае:

from Article a left join a.articleRelevance

Ключевое слово OUTER необязательно.

И ваш большой запрос становится:

select new service.orders.Order(order.orderNo, article.articleNo, article.articleName)
from Order order 
join order.article article
left outer join article.articleRelevance
where order.orderNo = :orderNo

Обратите внимание на использование именованного параметра :orderNo (не объединять параметры). Используйте это так:

String queryString = "...";
Query q = session.createQuery(queryString);
q.setParameter("orderNo", orderNumber);
List<Order> results = q.list();

Ссылки

...