Hibernat 使用Criteria查询多对多关系(SET集合)设置条件

在Hibernate众多查询方式的选择中,我本人由衷的喜欢Criteria这种方式对数据库进行操作,早在Hibernate出生就明确了其目标---让开发者不在头疼的写那些繁杂的native sql语句!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来得方面和直观。

        如果十分复杂的查询,对于hibernate来讲使用native sql会更为灵活一点,由Hibernate本身的封装特性决定了其使用,但不能不说它带来的巨大便捷性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值