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来得方面和直观。
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/jifeng/p/2004542.html
Copyright © 2011-2022 走看看