Hibernate 左外连接问题:连接时预期的路径

发布于 2024-09-26 19:08:11 字数 1058 浏览 0 评论 0原文

我有两张桌子,类似于:
文章和文章相关性
它们具有一对一的关系,并且 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);

论坛中,有人说这是“缺少功能”。真的?

I have two tables, something like:
Article and ArticleRelevance
They have a one to one relationship, and ArticleRelevance is optional, meaning a Article may (or may not) have a ArticleRelevance.

I want to select all articles along with the ArticleRelevance details.

With traditional SQL, I will do a outer join on the tables, like

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

I tried a similar query in HQL and got a Exception with message "Path Expected for Join"

I am unable to understand this message. What does this mean, and how do I solve it?

(As you probably have already guessed) I am an absolute hibernate newbie.

I have to use HQL. Actually I have an HQL already, joining two or three tables, and I have to add this condition.

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);

In this forum, someone says this is "missing functionality". True?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

余生再见 2024-10-03 19:08:11

我在 HQL 中尝试了类似的查询,但出现了异常,并显示消息“Path Expected for Join”

With 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();

参考资料

I tried a similar query in HQL and got a Exception with message "Path Expected for Join"

With HQL, a [ LEFT [OUTER] | INNER ] JOIN is done along an association path (constructed with an identification variable followed by a dot and an association field). So something like this in your case:

from Article a left join a.articleRelevance

The keyword OUTER is optional.

And your bigger query becomes:

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

Note the use of a named parameter :orderNo (don't concatenate parameters). Use it like this:

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

References

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文