zoukankan      html  css  js  c++  java
  • hibernate的基础学习--多表关联数据查询

    Hibernate共提供4种多表关联数据查询方式
      OID数据查询+OGN数据查询方式
      HQL数据查询方式
      QBC数据查询方式
      本地SQL查询方式(hibernate很少用)

    1、OID数据查询+OGN数据查询方式

     1 public class TestOID_OGN {
     2 
     3     /**
     4      * 什么时候时候什么时候发送
     5      */
     6     @Test
     7     public void findUser() {
     8         SessionFactory sf = H3Util.getSessionFactory();
     9         Session session = sf.openSession();
    10         Transaction ts = session.beginTransaction();
    11         //小李子
    12         User user = (User) session.get(User.class, "ff80808157c82de80157c82deb3c0001");
    13         System.out.println("=========");
    14         
    15         System.out.println(user);
    16         ts.commit();
    17         session.close();
    18     }
    19 }

    2、HQL数据查询方式

    /**
     * HQL 数据查询
     */
    public class TestHQL {
    
        @Test
        public void findUser() {
            SessionFactory sf = H3Util.getSessionFactory();
            Session session = sf.openSession();
            Transaction ts = session.beginTransaction();
            
            String hql = "from User";
            Query query = session.createQuery(hql);
            @SuppressWarnings("unchecked")
            List<User> users = query.list();
            for (User user : users) {
                System.out.println("=="+user);
            }
            
            ts.commit();
            session.close();
        }
        
        @Test
        public void findUser1() {
            SessionFactory sf = H3Util.getSessionFactory();
            Session session = sf.openSession();
            Transaction ts = session.beginTransaction();
            
            //项目部中的所有 员工详细信息
            
            String hql = "from Dept where deptname = '人事部'";
            Query query = session.createQuery(hql);
            Dept dept = (Dept) query.uniqueResult();
            
            //OGN
            Set<User> list = dept.getUsers();
            for (User user : list) {
                System.out.println(user);
            }
            
            ts.commit();
            session.close();
        }
        
        
        @Test
        public void findUser2() {
            SessionFactory sf = H3Util.getSessionFactory();
            Session session = sf.openSession();
            Transaction ts = session.beginTransaction();
            
            //项目部中的所有 员工详细信息
            //PO
            //Dept dept = (Dept) session.get(Dept.class,"ff80808157c831050157c83106c40001");
            
            //DO
            Dept dept = new Dept();
            dept.setDeptId("ff80808157c831050157c83106c40001");
            
            //以对象作为条件查询:根据对象id
            //只要保证该对象具备:OID  PO  DO
            
            String hql = "from User  where dept = ? ";
            Query query = session.createQuery(hql);
            query.setEntity(0, dept);
            //什么类型都可以只使用
            //query.setParameter(0, dept);
            
            
            @SuppressWarnings("unchecked")
            List<User> list = (List<User>) query.list();
            System.out.println("=================");
            for (User user : list) {
                System.out.println("=="+user);
            }
            
            ts.commit();
            session.close();
        }
    }

    3、QBC数据查询方式

     1 public class TestQBC {
     2 
     3     @Test
     4     public void findUser() {
     5         SessionFactory sf = H3Util.getSessionFactory();
     6         Session session = sf.openSession();
     7         Transaction ts = session.beginTransaction();
     8         
     9         Criteria criteria = session.createCriteria(User.class);
    10         criteria.add(Restrictions.eq("username", "小小"));
    11         
    12         User user = (User) criteria.uniqueResult();
    13         //session.clear();
    14         System.out.println("=========");
    15         System.out.println(user.getDept());
    16         
    17         ts.commit();
    18         session.close();
    19     }
    20     
    21     @Test
    22     public void findUser1() {
    23         SessionFactory sf = H3Util.getSessionFactory();
    24         Session session = sf.openSession();
    25         Transaction ts = session.beginTransaction();
    26         
    27         Dept dept = new Dept();
    28         dept.setDeptId("ff80808157c831050157c83106c40001");
    29         
    30         Criteria criteria = session.createCriteria(User.class);
    31         criteria.add(Restrictions.eq("dept", dept));
    32             
    33         @SuppressWarnings("unchecked")
    34         List<User> list = criteria.list();
    35         System.out.println("=========分割线===========");
    36         for (User user : list) {
    37             System.out.println(user);
    38         }
    39         
    40         ts.commit();
    41         session.close();
    42     }
    43     
    44     @Test
    45     public void findUser2() {
    46         SessionFactory sf = H3Util.getSessionFactory();
    47         Session session = sf.openSession();
    48         Transaction ts = session.beginTransaction();
    49         
    50         Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001");
    51         
    52         //from User dept.deptId = '4028408157c14c210157c14c25370000'
    53         Criteria criteria = session.createCriteria(User.class);
    54         //使用OGN:OID
    55         criteria.add(Restrictions.eq("dept.deptId", dept.getDeptId()));
    56         
    57         
    58         System.out.println("==========分割线============");
    59         @SuppressWarnings("unchecked")
    60         List<User> list = criteria.list();
    61         for (User user : list) {
    62             System.out.println(user);
    63         }
    64         
    65         ts.commit();
    66         session.close();
    67     }
    68     
    69     
    70     @Test
    71     public void findUser3() {
    72         SessionFactory sf = H3Util.getSessionFactory();
    73         Session session = sf.openSession();
    74         Transaction ts = session.beginTransaction();
    75         
    76         Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001");
    77         
    78         //from User dept.deptName = '项目部'
    79         Criteria criteria = session.createCriteria(User.class);
    80         //QBC:ONG方式中如果使用的的OID可以查询,但是如果使用的是除OID之外的其它属性
    81         //就会报异常,解决方案:createAlias("dept")
    82         //为dept起别名
    83         criteria.createAlias("dept", "dept");
    84         criteria.add(Restrictions.eq("dept.deptName", dept.getDeptName()));
    85 
    86         @SuppressWarnings("unchecked")
    87         List<User> list = criteria.list();
    88         System.out.println("==========分割线===========");
    89         for (User user : list) {
    90             System.out.println(user);
    91         }
    92         
    93         ts.commit();
    94         session.close();
    95     }
    96 }

    4、HQL数据查询方式(测试内连接,外连接查询)

      1 /**
      2  * @author nunu
      3  * 测试内连接,外连接查询
      4  */
      5 public class TestHQL2 {
      6 
      7     
      8     /**
      9      * 内连接:
     10      *  有关联数据:
     11      *  数据总量:从表被关联的数据总量
     12      *    数据模型:主表数据(延迟从) + 从表数据(含主)
     13      * 
     14      */
     15     @Test
     16     public void findUser() {
     17         SessionFactory sf = H3Util.getSessionFactory();
     18         Session session = sf.openSession();
     19         Transaction ts = session.beginTransaction();
     20         
     21         //部门:主表
     22         //员工:从表
     23         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
     24         String hql = "from Dept d inner join d.users";
     25         Query query = session.createQuery(hql);
     26         
     27         @SuppressWarnings("unchecked")
     28         List<Object[]> list = query.list();
     29         System.out.println(list.size());
     30         
     31         System.out.println("==========分割线===========");
     32         for (int i = 0; i < list.size(); i++) {
     33             Object[] objs = list.get(i);
     34             //主表数据
     35             Dept dept = (Dept) objs[0];
     36             User user = (User) objs[1];
     37             System.out.println(user);
     38             System.out.println(dept);
     39             /*
     40             //主表关联数据
     41             Set<User> userSet = dept.getUsers();
     42             for (User user : userSet) {
     43                 //如果延迟加载:回发送新语句查询
     44                 System.out.println(user);
     45             }
     46             */
     47             System.out.println("==");
     48             /*
     49             //从表数据
     50             User user = (User) objs[1];
     51             
     52             //从表关联数据
     53             Dept dept = user.getDept();
     54             
     55             System.out.println(dept);
     56             */
     57         }
     58         
     59         ts.commit();
     60         session.close();
     61     }
     62     
     63     
     64     /**
     65      *     迫切内连接(数据重复DISTINCT)
     66      *        数据总量:从表被关联的数据总量
     67      *        数据模型:主表数据 (含从)
     68     */
     69     @Test
     70     public void findUser1() {
     71         SessionFactory sf = H3Util.getSessionFactory();
     72         Session session = sf.openSession();
     73         Transaction ts = session.beginTransaction();
     74         
     75         //部门:主表
     76         //员工:从表
     77         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
     78         String hql = "from Dept d inner join fetch d.users";
     79         Query query = session.createQuery(hql);
     80         @SuppressWarnings("unchecked")
     81         List<Dept> list = query.list();
     82         System.out.println(list.size());
     83         System.out.println("===============分隔符=================");
     84         session.clear();
     85         for (Dept dept : list) {
     86             Set<User> users = dept.getUsers();
     87             for (User user : users) {
     88                 System.out.println(user);
     89             }
     90             System.out.println("---------");
     91         }
     92         
     93         ts.commit();
     94         session.close();
     95     }
     96     
     97     
     98     /**
     99      *     隐式内连接
    100      *         数据总量:主表数据总量
    101      *         数据模型:主表数据(延迟从)
    102     */
    103     @Test
    104     public void findUser2() {
    105         SessionFactory sf = H3Util.getSessionFactory();
    106         Session session = sf.openSession();
    107         Transaction ts = session.beginTransaction();
    108         
    109         //部门:主表
    110         //员工:从表
    111         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
    112         String hql = "from Dept";        //默认就会用户关联了
    113         Query query = session.createQuery(hql);
    114         @SuppressWarnings("unchecked")
    115         List<Dept> list = query.list();
    116         System.out.println(list.size());
    117         //session.clear();
    118         System.out.println("===============分隔符=================");
    119         for (Dept dept : list) {
    120             Set<User> users = dept.getUsers();
    121             for (User user : users) {
    122                 System.out.println(user);
    123             }
    124             System.out.println("-----------------");
    125         }
    126         
    127         ts.commit();
    128         session.close();
    129     }
    130     
    131     
    132     /**
    133         左外连接: 以左侧表为准
    134             数据总量:从表被关联数据总量+主表未关联数据总量
    135             数据模型:主表数据(延迟从) ,从表数据 (含主)
    136             (主表不存在关联数据的从表数据为0)
    137     */
    138     @Test
    139     public void findUser3() {
    140         SessionFactory sf = H3Util.getSessionFactory();
    141         Session session = sf.openSession();
    142         Transaction ts = session.beginTransaction();
    143         
    144         //部门:主表
    145         //员工:从表
    146         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
    147         String hql = "from Dept d left outer join d.users";//默认就会用户关联了
    148         Query query = session.createQuery(hql);
    149         
    150         @SuppressWarnings("unchecked")
    151         List<Object[]> list = query.list();
    152         System.out.println(list.size());
    153         
    154         System.out.println("============分隔符==============");
    155         for (int i = 0; i < list.size(); i++) {
    156             Object[] objs = list.get(i);
    157             //主表数据
    158             System.out.println("	 ==主表数据");
    159             Dept dept = (Dept) objs[0];
    160             System.out.println("	 "+dept);
    161             
    162             System.out.println("	 ==主表关联数据");
    163             //主表关联数据
    164             Set<User> userSet = dept.getUsers();
    165             for (User user : userSet) {
    166                 //如果延迟加载:回发送新语句查询
    167                 System.out.println("	 "+user);
    168             }
    169             
    170             System.out.println("	 ==从表数据");
    171             //从表数据
    172             User user = (User) objs[1];
    173             System.out.println("	 "+user);
    174             
    175             System.out.println("	 ==从表关联数据");
    176             //从表关联数据
    177             Dept dept1 = user.getDept();
    178             
    179             System.out.println("	 "+dept1);
    180             System.out.println("-------------");
    181         }
    182         ts.commit();
    183         session.close();
    184     }
    185     
    186     
    187     /**
    188      *    迫切左外连接(数据重复DISTINCT)
    189             数据总量:从表被关联数据总量+主表未关联数据总量
    190             数据模型:主表数据(含从)
    191             (主表不存在关联数据的从表数据为0)
    192     */
    193     @Test
    194     public void findUser4() {
    195         SessionFactory sf = H3Util.getSessionFactory();
    196         Session session = sf.openSession();
    197         Transaction ts = session.beginTransaction();
    198         
    199         //部门:主表
    200         //员工:从表
    201         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
    202         String hql = "from Dept d left outer join fetch d.users";//默认就会用户关联了
    203         Query query = session.createQuery(hql);
    204         
    205         @SuppressWarnings("unchecked")
    206         List<Dept> list =  query.list();
    207         System.out.println("============分隔符==============");
    208         for (Dept dept : list) {
    209             System.out.println(dept);
    210             
    211             Set<User> userSet = dept.getUsers();
    212             for (User user : userSet) {
    213                 System.out.println(user);
    214             }
    215             System.out.println("-----------");
    216         }
    217         ts.commit();
    218         session.close();
    219     }
    220     
    221     
    222     
    223     /**
    224      *    右外连接:
    225             数据总量:从表数据总量
    226             数据模型:主表数据(延迟从) ,从表数据(含主)
    227             (从表不存在关联数据的主表数据为null)
    228     */
    229     @Test
    230     public void findUser5() {
    231         SessionFactory sf = H3Util.getSessionFactory();
    232         Session session = sf.openSession();
    233         Transaction ts = session.beginTransaction();
    234         
    235         //部门:主表
    236         //员工:从表
    237         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
    238         String hql = "from Dept d right outer join  d.users";//默认就会用户关联了
    239         Query query = session.createQuery(hql);
    240         
    241         @SuppressWarnings("unchecked")
    242         List<Object[]> list = query.list();
    243         System.out.println(list.size());
    244         System.out.println("=============分隔符=================");
    245         for (int i = 0; i < list.size(); i++) {
    246             Object[] objs = list.get(i);
    247             //主表数据
    248             //Dept dept = (Dept) objs[0];
    249             //System.out.println(dept.getDeptName());
    250             
    251             
    252             //主表关联数据
    253             /*Set<User> userSet = dept.getUsers();
    254             for (User user : userSet) {
    255                 //如果延迟加载:回发送新语句查询
    256                 System.out.println(user.getUserId());
    257             }*/
    258             
    259             //从表数据
    260             User user = (User) objs[1];
    261             System.out.println(user);
    262             
    263             //从表关联数据
    264 //            Dept dept = user.getDept();
    265 //            System.out.println(dept.getDeptName());
    266 //            System.out.println(user.getUsername());
    267             System.out.println("-------------");
    268         }
    269         ts.commit();
    270         session.close();
    271         ts.commit();
    272         session.close();
    273     }
    274     
    275     
    276 }
  • 相关阅读:
    Scala In 5 Years – My Prediction « GridGain – Real Time Big Data
    牛魔王珍满福拉面 北京团购网|京东团购
    Build WebKit On Windows 白果果白的专栏 博客频道 CSDN.NET
    fabulous
    Selenimu做爬虫 oscarxie 博客园
    EA gpl
    数据挖掘与Taco Bell编程
    test cpp could not compiled on ubuntu use g++,i'll tried lateor on win platform
    How to use ActiveRecord without Rails
    svn添加新项目管理并添加到trac 知识是一种越吃越饿的粮食 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/acmwangpeng/p/5970863.html
Copyright © 2011-2022 走看看