Hibernate学习笔记(七)查询总结

Hibernate查询分类

  1. get/load 根据OID检索
  2. 对象视图检索 c.getOrders
  3. Sql语句 createSqlQuery
  4. Hql语句 createQuery
  5. Criteria查询 createCriteria

HQL语句详解

  1. 简介:
    • 描写对象操作的一种查询语句,Hibernate特有的
    • 与SQL语句大致一致,不同的是HQL语句是面向对象查询,查询的是对象和对象中的属性
  2. 查询所有
	//HQL语句查询
	//查询所有
	@Test
	public void test2(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		Query query = session.createQuery("from Customer");
		
		List<Customer> list = query.list();
		
		System.out.println(list);
		
		session.getTransaction().commit();
		session.close();
	}

  1. 查询几个属性
	//HQL语句查询
	//选择查询
	@Test
	public void test3(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		Query query = session.createQuery("select c.id,c.name from Customer c");
		
		List<Object[]> list = query.list();
		
		for(Object[] o : list){
			System.out.println(Arrays.toString(o));
		}
		//System.out.println(list);
		
		session.getTransaction().commit();
		session.close();
	}
  1. 投影查询:选择查询的基础上,想把查询结果封装到对象中
    • 前提需要类有构造函数
      在这里插入图片描述
	//HQL语句查询
	//投影查询
	@Test
	public void test4(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		Query query = session.createQuery("select new Customer(c.id,c.name) from Customer c");
		
		List<Customer> list = query.list();
		
//		for(Object[] o : list){
//			System.out.println(Arrays.toString(o));
//		}
		System.out.println(list);
		
		session.getTransaction().commit();
		session.close();
	}
  1. 排序
//HQL语句查询
	//排序查询
	@Test
	public void test5(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//降序
		Query query = session.createQuery("select new Customer(c.id,c.name) from Customer c Order by c.id desc");
		//升序
		Query query = session.createQuery("select new Customer(c.id,c.name) from Customer c Order by c.id asc");
		List<Customer> list = query.list();
		
//		for(Object[] o : list){
//			System.out.println(Arrays.toString(o));
//		}
		System.out.println(list);
		
		session.getTransaction().commit();
		session.close();
	}
  1. 分页
//HQL语句查询
		//分页查询
		@Test
		public void test5(){
			Session session = HibernateUtils.openSession();
			session.beginTransaction();
			//降序
			Query query = session.createQuery("select new Customer(c.id,c.name) from Customer c Order by c.id desc");
			//升序
			//Query query = session.createQuery("select new Customer(c.id,c.name) from Customer c Order by c.id asc");
			
			//分页 limit ?,?(setFirstResult,setMaxResults)
			//(当前页数-1)*每页最大记录数
			query.setFirstResult(1);//从哪个索引开始取数据,包括索引
			query.setMaxResults(1);//取几个
			List<Customer> list = query.list();
			
//			for(Object[] o : list){
//				System.out.println(Arrays.toString(o));
//			}
			System.out.println(list);
			
			session.getTransaction().commit();
			session.close();
		}
  1. 绑定参数查询
//HQL语句查询
		//绑定查询
		@Test
		public void test7(){
			Session session = HibernateUtils.openSession();
			session.beginTransaction();
			
			//第一种方式:
			/*Query query = session.createQuery("from Customer c where id = ?");
			//(?,?)参数1:?占位符的索引,第一个问号索引为0
			query.setInteger(0, 1);*/
			
			//第二种方式:
			Query query = session.createQuery("from Customer c where id = :h");
			//(?,?)参数1:?占位符的名称
			query.setInteger("h", 1);
			
			
			//List<Customer> list = query.list();
			//System.out.println(list);
			
			
			Customer c = (Customer) query.uniqueResult();
			System.out.println(c);
			
//			for(Object[] o : list){
//				System.out.println(Arrays.toString(o));
//			}

			
			session.getTransaction().commit();
			session.close();
		}
  1. 聚合函数
		//HQL语句查询
		//聚合函数查询
		@Test
		public void test8(){
			Session session = HibernateUtils.openSession();
			session.beginTransaction();
			//count函数
			//Query query = session.createQuery("select count(*) from Customer c");
			//avg函数
			//Query query = session.createQuery("select avg(c.id) from Customer c");
			//sum函数
			//Query query = session.createQuery("select sum(c.id) from Customer c");
			//Max函数
			//Query query = session.createQuery("select max(c.id) from Customer c");
			//Min函数
			Query query = session.createQuery("select min(c.id) from Customer c");
			
			
			Object o = query.uniqueResult();
			
			System.out.println(o);

			
			session.getTransaction().commit();
			session.close();
		}
  1. 分组查询
		//HQL语句查询
		//分组查询
		@Test
		public void test9(){
			Session session = HibernateUtils.openSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select o.customer,count(o) from Order o group by o.customer");
			List<Object[]> list = query.list();
			
			for(Object[] o : list){
				System.out.println(Arrays.toString(o));
			}
			
			

			
			session.getTransaction().commit();
			session.close();
		}
  1. 命名查询
    • 将HQL从java源码中,提取到配置文件中。
      • 全局:在任何位置都能获得到,在**.hbm.xml中class元素后面创建query元素

        • Query query = session.getNamedQuery("abc");
          在这里插入图片描述
      • 局部:在特定的包下才能获得到,在**.hbm.xml中class元素里面创建query元素

        • Query query = session.getNamedQuery("com.itheima.domain.Customer.bcd");
          在这里插入图片描述
  2. 表连接
//HQL详解2-表连接

//内连接	=>
//左外连接 =>
//右外连接 =>
public class Demo2 {
	@Test
	//交叉连接 => 笛卡尔积
	//开发时要避免出现笛卡尔积
	public void fun1(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		Query query = session.createQuery("from Customer c,Order o");
		
		
		List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	@Test
	//内连接 
	//隐式内连接 => 在笛卡尔积基础上过滤无效数据
	public void fun2(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		Query query = session.createQuery("from Customer c,Order o where o.customer = c");
		
		
		List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	@Test
	//内连接
	//显式内连接( 非迫切)=> inner join
	// List<Object[]>
	// Object[] => [Customer,Order]
	// 将父 与 子 对象装入数组中分别 返回
	public void fun3(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		//Query query = session.createQuery("from Customer c  inner join c.orders ");
		
		Query query = session.createQuery("from Customer c  inner join   c.orders ");
		
		List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	@Test
	//内连接
	//显式内连接(迫切)=> inner join
	// List<Customer> 
	// 迫切连接会将 子装入父中,组装成一个对象
	public void fun4(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		
		Query query = session.createQuery("from Customer c  inner join fetch  c.orders ");
		
		List<Object> list = query.list();
		
		for(Object obj : list){
			System.out.println(obj);
		}
		
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	
	@Test
	//左外连接
	//left [outer] join
	public void fun5(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		
		Query query = session.createQuery("from Customer c  left outer join   c.orders ");
		
		List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	@Test
	//左外连接 迫切
	//left [outer] join fetch
	public void fun6(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		
		Query query = session.createQuery("from Customer c  left outer join fetch  c.orders ");
		
		
		List<Object> list = query.list();
		
		for(Object obj : list){
			System.out.println(obj);
		}
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	

	@Test
	//右外连接
	//right [outer] join
	public void fun7(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		
		Query query = session.createQuery("from Customer c  right outer join   c.orders ");
		
		List<Object[]> list = query.list();
		
		for(Object[] objs : list){
			System.out.println(Arrays.toString(objs));
		}
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
	@Test
	//右外连接 迫切
	//right [outer] join fetch
	public void fun8(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		
		
		Query query = session.createQuery("from Customer c  right outer join fetch  c.orders ");
		
		
		List<Object> list = query.list();
		
		for(Object obj : list){
			System.out.println(obj);
		}
		
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值