Hibernate many-to-many 查询写法

« TTServer Java 客户端 Tyrond用 HttpServletResponseWrapper 实现 Etag 过滤器 »

Hibernate many-to-many 查询写法

发表于:2009年7月18日 | 分类:groovy & grails | 标签: grailshibernatehqlmany-to-manyquery | views(1,217)

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.

原文出处:http://blog.chenlb.com/2009/07/hibernate-many-to-many-query-style.html

玩 Grails 的时候,遇到一个问题,卡在 many-to-many 查询上了。之前学 hibernate 不深,所以会卡。

先来看下例子:两个实体类 Blog、Tag,它们是多对多关系。

例如要查找 tag 为 j2ee 的所有博客文章。

1、用 HQL

  1. //记录数  
  2. def blogNum = Blog.executeQuery("select count(bs) from Blog as bs left join bs.tags as t where t.name=:tname",[tname:params.tag])  
  3. 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

  1. //记录数  
  2. def c = Blog.createCriteria()  
  3. def blogNum = c {  
  4.     projections {//记数投影  
  5.         count('id')  
  6.     }  
  7.     tags {//join Tag  
  8.         eq('name', params.tag)  
  9.     }  
  10. }  
  11. //找内容  
  12. def blogC = Blog.createCriteria()  
  13. def blogs = blogC.list {  
  14.     tags {  
  15.         eq('name', params.tag)  
  16.     }  
  17.     firstResult(params.offset)  
  18.     maxResults(params.max)  
  19. }  

看了它们的输出 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

Hibernate many-to-many 查询写法

随机日志 »

相关日志 »

相关推荐