Hibernate HQL多表查询

1、内连接和迫切内连接

  (1)内连接

    HQL语句:from 实体类名 实体类别名 inner join 实体类别名.表示另一个表数据的集合名称

  (2)迫切内连接

    HQL语句:from 实体类名 实体类别名 inner join fetch 实体类别名.表示另一个表数据的集合名称

  (3)区别:内连接返回的数据以数组的方式封装,迫切内连接返回的数据以对象的方式封装。

  (4)代码:

    内连接代码: 

    // 使用HQL内连接查询
        @Test
        public void test1() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、创建Query对象,写hql语句
                Query query = session.createQuery("from Sort s inner join s.setGoods");
                
                //调用list方法得到数据
                List<Object> objects =query.list();
                //遍历list得到数组
                for (Object object : objects) {
                    Object[] objects2 = (Object[]) object;
                    System.out.println(Arrays.toString(objects2));
        
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }

    迫切内连接代码:

// 使用HQL迫切内连接查询
    @Test
    public void test2() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            // 1、创建Query对象,写hql语句
            Query query = session
                    .createQuery("from Sort s inner join fetch s.setGoods");

            // 调用list方法得到数据
            List<Object> objects = query.list();
            // 遍历list得到数组
            for (Object object : objects) {
                System.out.println(object);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

2、左外连接和迫切左外连接

  (1)左外连接

    HQL语句:from 实体类名 实体类别名 left outer  join 实体类别名.表示另一个表数据的集合名称

  (2)迫切左外连接

    HQL语句:from 实体类名 实体类别名 left outer join fetch 实体类别名.表示另一个表数据的集合名称

  (3)区别:左外连接返回的数据以数组的方式封装,迫切左外连接返回的数据以对象的方式封装。

  (4)代码:

    左外连接代码: 

    // 使用HQL左外连接查询
    @Test
    public void test3() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            // 1、创建Query对象,写hql语句
            Query query = session
                    .createQuery("from Sort s left outer join  s.setGoods");

            // 调用list方法得到数据
            List<Object> objects = query.list();
            // 遍历list得到数组
            //调用list方法得到数据
            //遍历list得到数组
            for (Object object : objects) {
                Object[] objects2 = (Object[]) object;
                System.out.println(Arrays.toString(objects2));
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

    迫切左外连接代码:

// 使用HQL迫切左外连接查询
    @Test
    public void test4() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            // 1、创建Query对象,写hql语句
            Query query = session
                    .createQuery("from Sort s left outer join fetch s.setGoods");

            // 调用list方法得到数据
            List<Object> objects = query.list();
        
            for (Object object : objects) {
                
                System.out.println(object);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

3、右外连接

    HQL语句:from 实体类名 实体类别名 right outer  join 实体类别名.表示另一个表数据的集合名称

  代码:

// 使用HQL右外连接查询
        @Test
        public void test5() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1、创建Query对象,写hql语句
                Query query = session
                        .createQuery("from Sort s right outer join  s.setGoods");

                // 调用list方法得到数据
                List<Object> objects = query.list();
            
                for (Object object : objects) {
                    Object[] objects2 = (Object[]) object;
                    System.out.println(Arrays.toString(objects2));
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
原文地址:https://www.cnblogs.com/jack1995/p/6953110.html