有两种型号:页面&标签。一个页面可以有很多标签。与此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.tag
是Set
和Hibernate似乎无法从该查询结果创建它。
那么我该如何解决这个问题呢?有没有问题的查询或有没有办法来解决TypeMismatchException
?
奖金的问题: 我发现下面的解决方案,它在某种程度上工程..律位至少:
List<Page> pageList = (List<Page>) session.createQuery("from Page where id in (from Tag where tag = 'sport')").list();
它的工作原理..但它只提供了具有标签“运动”的页面一半。有人能解释为什么吗?
任何建议,高度赞赏!
谢谢,但它仍然提供了我已经得到的同样的错误: [QuerySyntaxException:加入的路径! [来自models.Page作为页面加入标记为标签where tags.tag ='sport']] 将调查更多。 – Crayl
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
确实需要select子句! – Julien