我有两张桌子,例如:
文章和条款相关
它们具有一对一的关系,ArticleRelevance是可选的,这意味着文章可能(或可能不)具有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);
在this论坛中,有人说这是“缺少功能”。真?
答案 0 :(得分:8)
我在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();