2014-04-01 42 views
0

有两种型号:页面&标签。一个页面可以有很多标签。与此MySQL查询等效的Hibernate是什么?

页:

public class Page { 
    @Id 
    @GeneratedValue 
    @Column(name="page_id") 
    private Integer id; 

    // TAGS 
    @OneToMany(orphanRemoval=true, mappedBy="pageId", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Tag> tag = new HashSet<Tag>(); 
} 

标签:

public class Tag { 

    // GENERIC FIELDS 
    @Id 
    @GeneratedValue 
    private Integer id; 

    @Index(name = "tag") 
    @Column 
    private String tag; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name="page_id") 
    private Page pageId; 
} 

现在的任务是选择具有特定代码的网页。与普通的MySQL我会做(工作正常):

SELECT * from Page join Tag on Page.page_id = Tag.page_id where Tag.tag = 'sport' 

但是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']] 

当我删除了“意外的标记”,则Hibernate再次抱怨:

List<Page> pageList = (List<Page>) session.createQuery("from Page join Tag where tag = 'sport'").list(); 
[TypeMismatchException: left and right hand sides of a binary logic operator were incompatibile [java.util.Set(models.Page.tag) : string]] 

问题的第二种方法似乎是,这Page.tagSet和Hibernate似乎无法从该查询结果创建它。

那么我该如何解决这个问题呢?有没有问题的查询或有没有办法来解决TypeMismatchException

奖金的问题: 我发现下面的解决方案,它在某种程度上工程..律位至少:

List<Page> pageList = (List<Page>) session.createQuery("from Page where id in (from Tag where tag = 'sport')").list(); 

它的工作原理..但它只提供了具有标签“运动”的页面一半。有人能解释为什么吗?

任何建议,高度赞赏!

回答

1

在HQL你只需加入使用集合名称:

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

您的收藏标签都有一个混乱名字,我会命名为“标记列表”,以避免与标签属性(字符串之一)混淆。

+0

谢谢,但它仍然提供了我已经得到的同样的错误: [QuerySyntaxException:加入的路径! [来自models.Page作为页面加入标记为标签where tags.tag ='sport']] 将调查更多。 – Crayl

+0

hmm?我的编辑在哪里?获胜的查询是:从页面p中选择p left将p.tag作为t where t.tag ='sport'...在这里解释:http://stackoverflow.com/questions/4450844/hibernate-org-hibernate-hql- ast-querysyntaxexception-unexpected-token – Crayl

+0

确实需要select子句! – Julien

1

在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' 
+0

谢谢,但我仍然得到错误: 从页P于p.page_id = t.page_id其中t.tag = '运动' 加入标签T 错误:[QuerySyntaxException:意外的标记:在靠近1号线,列31 [from models.Page p join p.page_id = t.page_id标签t其中t.tag ='sport']] from Page p where p.tag.tag ='sport' Error:[QueryException:illegal尝试解除引用集合[page0_.page_id.tag]与元素属性参考[标签] [从models.Page p其中p.tag.tag ='sport']] 嗯..试过一切,仍然无法正常工作。将调查更多:/ – Crayl

+0

@Crayl抱歉,您必须使用属性名称,而不是列名,在我的回答中修复了 –

+0

没有工作。找到一个工作解决方案查看朱利安的答案 - 但非常感谢你的帮助! – Crayl

相关问题