Java Hibernate与这个MySQL查询的等价物是什么?

Java Hibernate与这个MySQL查询的等价物是什么?,java,mysql,hibernate,Java,Mysql,Hibernate,有两种模型:页面和标签。一个页面可以有多个标签 第页: 现在的任务是选择具有特定标记的所有页面。使用纯MySQL,我会这样做(效果很好): 但是Hibernate抱怨如果我这样做: List<Page> pageList = (List<Page>) session.createQuery("from Page join Tag on Page.page_id = Tag.page_id where Tag.tag = 'sport'").list(); // ERROR

有两种模型:页面和标签。一个页面可以有多个标签

第页:

现在的任务是选择具有特定标记的所有页面。使用纯MySQL,我会这样做(效果很好):

但是Hibernate抱怨如果我这样做:

List<Page> pageList = (List<Page>) session.createQuery("from Page join Tag on Page.page_id = Tag.page_id where Tag.tag = 'sport'").list();
// ERROR: [QuerySyntaxException: unexpected token: on near line 1, column 27 [from models.Page join Tag on Page.page_id = Tag.page_id where tag = 'sport']] 
它起作用了。。但它只提供了标签为“运动”的页面的一半。有人能解释一下原因吗


非常感谢您的任何建议

在HQL中,您只需使用集合名称加入:

from Page as page left join tag as tags where tags.tag = 'sport'

您的集合标记有一个容易混淆的名称,我将其命名为“tagList”,以避免与标记属性(字符串)混淆。

在HQL和JPQL中,如果您想在FROM子句之后引用实体属性,则需要指定别名;所以你的问题是:

from Page p join Tag t on p.id = t.pageId where t.tag = 'sport'
还有另一种隐式联接语法:

from Page p where p.tag.tag = 'sport'
要完全符合JPQL,还需要指定select子句:

select p from Page p where p.tag.tag = 'sport'

谢谢,但我仍然收到错误:从p.Page\u id=t.Page\u id其中t.Tag='sport'错误:[QuerySyntaxException:意外标记:在第1行第31列附近[来自models.Page p join Tag t on p.Page\u id=t.Page\u id其中t.Tag='sport']]从p其中p.Tag.Tag='sport'错误:[QueryException:非法尝试使用元素属性引用[tag][from models.page p,其中p.tag.tag='sport']取消对集合[page0_u.page_id.tag]的引用]嗯..尝试了所有方法,仍然无效。将进一步调查:/@Crayl抱歉,您必须使用属性名,而不是列名,在我的回答中修复了此问题。找到了一个有效的解决方案。请参阅Julien的答案-但非常感谢您的帮助!谢谢,但它仍然提供了我已经遇到的相同错误:[QuerySyntaxException:Path expected for join![from models.Page as Page join Tag as tags where tags.Tag='sport']]将进行更多调查。嗯?我的编辑在哪里?获胜的查询是:从第p页选择p left join p.Tag as t,其中t.Tag='sport'…此处解释:select子句确实是必要的!
List<Page> pageList = (List<Page>) session.createQuery("from Page where id in (from Tag where tag = 'sport')").list();
from Page as page left join tag as tags where tags.tag = 'sport'
from Page p join Tag t on p.id = t.pageId where t.tag = 'sport'
from Page p where p.tag.tag = 'sport'
select p from Page p where p.tag.tag = 'sport'