首页 > 其他 > 详细

criteria 级联查询

时间:2017-02-08 10:33:37      阅读:139      评论:0      收藏:0      [点我收藏+]

如果实体对象中没有关联对象的情况使用DetachedCriteria进行查询是一件很简单的事情。 
如果实体对象中含有OneToOne或者ManyToOne关联对象的情况可以参考下面方式,使用别名: 
假设要通过stuName查询一个学生Student记录,可以如下: 

  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE));  


     
如果要通过Student的Team的teamName查询一个Student记录,很多人都会这么写: 

  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));  


     
遗憾的是上述程序报错,说是在Student中找不到team.teamName属性,这是可以理解的。那么如何通过teamName查找Student呢? 
可以这么写: 

  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.createAlias("team", "t");  
  3. dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));  


没错,就是要先建立team的引用,才能用team导航到teamName。 

这里有一个特殊情况,如果是对引用对象的id查询,则可以不用建立引用,也就是可以不调用createAlias()语句,如下所示: 

  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));  


据我个人的经验,team后只能跟其主键属性,比较其他属性要用别名。此主键属性可以用“id”字符来指代,也可以用team的主键属性来指代。换句话说,我的Student类的类主键“stuId”,不管是在HQL还是在QBC中,都可以用stu.id来指代stu.stuId。在这里可以看出 “id”字符的特殊性。上述是个人观点,并未得到确实的证实。 

补充: 
如果是三级或更多级查询怎么办? 

以三级查询为例,仍引用上面的例子: 

  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.createAlias("team", "t");  
  3. dc.createAlias("t.school", "s");  
  4. dc.add(Restrictions.like("s.schoolName", schoolName, MatchMode.ANYWHERE));  


如果实体对象中含有OneToMany关联对象的情况,既是实体中含有listSet等关联实体集合的情况下怎么办呢? 
这个还不知道怎么办,呵呵 
方法其实是非常简单的: 

  1. dc.createAlias("tags", "t");          
  2. dc.add(Restrictions.eq("t.id", tagId));  


其中tags是个Set,但是想查找属性tags中含有id为tagId的实体,使用上面的就可以了。

criteria 级联查询

原文:http://www.cnblogs.com/lihongfeng0121/p/6376944.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!