玩 Grails 的时候,遇到一个问题,卡在 many-to-many 查询上了。之前学 hibernate 不深,所以会卡。
先来看下例子:两个实体类 Blog、Tag,它们是多对多关系。
例如要查找 tag 为 j2ee 的所有博客文章。
1、用 HQL
- //记录数
- def blogNum = Blog.executeQuery("select count(bs) from Blog as bs left join bs.tags as t where t.name=:tname",[tname:params.tag])
- def blogs = Blog.executeQuery("select bs from Blog as bs left join bs.tags as t where t.name=:tname",[tname:params.tag], [max:params.max, offset:params.offset])
hql 是比 sql 方便,sql 要多写一个 join。但要对 hql 熟悉才行。
2、用 Criteria
- //记录数
- def c = Blog.createCriteria()
- def blogNum = c {
- projections {//记数投影
- count('id')
- }
- tags {//join Tag
- eq('name', params.tag)
- }
- }
- //找内容
- def blogC = Blog.createCriteria()
- def blogs = blogC.list {
- tags {
- eq('name', params.tag)
- }
- firstResult(params.offset)
- maxResults(params.max)
- }
看了它们的输出 sql,基本没区别,Criteria 的方式是用 left outer join 的,其实与 left join 一样,用 hql 就可以自己控制 join 吧,还有就是可以节省两个匿名类。还是选择用 hql 方式吧。
可能还有其它方式……
hibernate 3.x 的 hql 中文手册:http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/queryhql.html