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(); } }