zoukankan      html  css  js  c++  java
  • Hibernat 使用Criteria查询多对多关系(SET集合)条件

    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来得方面和直观。
  • 相关阅读:
    安装nodejs和yarn(配置淘宝源)
    适用于 Linux 的 Windows 子系统没有已安装的分发版
    selenium定位元素click时报错
    dubbo从入门到实战(转)
    SpringBoot整合JPA简单介绍
    办公自动化路上的异化
    邮箱黑名单:如何查看邮件IP是否被列入黑名单,及如何删除
    邮箱黑名单(1):
    Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)
    AD中FSMO五大角色的介绍及操作
  • 原文地址:https://www.cnblogs.com/jifeng/p/2004542.html
Copyright © 2011-2022 走看看