关闭

灵活使用Hibernate的查询对象DetachedCriteria

898人阅读 评论(0) 收藏 举报

Hibernate提供了HQL,方便查询的编写。但是在某些情况下,我更喜欢用Criteria,因为它的语义非常明确。

在处理对象关联的时候,经常要对对象下的某个集合字段进行条件限制。比如下面的类:

public class MainClass
{
protected
long id;
  protected int type;
  protected Set<SubClass>
subs= new HashSet<SubClass>();

  ......  getter/setter


public class SubClass
{
protected
long id;
  protected int value;
  protected Set<MainClass> ms = new HashSet<MainClass>();

  ...... getter/setter

在初始化数据中,假设MainClass的实例m1含有SubClass的实例s1,s2,s3;MainClass的实例m2含有SubClass的实例s2,s3,s4。

而其中s1,s2,s3,s4的value分别是1,2,3,4 

现在要查询出 MainClass中SubClass集合含有SubClass实例value为2的的MainClass实例并且type为1,可以使用下面的查询方法:

  DetachedCriteria criteria = DetachedCriteria.forClass(MainClass.class); 

criteria
.add(Restrictions.eq("type", new Integer(1)))
        .createAlias("subs", "s")
.add(Restrictions.eq("s.value", new Integer(2)));

执行此查询对象后会得到符合条件的MainClass实例。

需要注意的是在获取的MainClass实例中,subs是完全的记录集,而不是经过过滤的记录集,也就是相当于根据MainClass的ID获取的完整实例一样。

ps: 

  如果需要过滤subs的记录集,需要使用额外的过滤方法,请参考Hibernate的具体实现。

  使用HQL也可以很方便地实现,但是需要给出完整的join标记,不如createAlias来得方面和直观。

                                                                                                                                                       post by:Hubert Star(hubertstar@gmail.com)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2622次
    • 积分:58
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论