Hibernate学习笔记 -- day07 HQL、QBC查询用法

一、HQL的查询

1、hibernate查询涉及的对象

        Query对象

2、如何获取Query对象

        session.createQuery(String hql);

3、什么是HQL

        hibernate query language

        它就是把sql语句中的表名换成了实体类名。把表中的列名换成了实体类中的属性名。

         select * 可以省略。

4、基本用法:查询所有

	/**
	 * 查询所有客户
	 */
	@Test
	public void test1(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("from Customer");
		//2.把查询结果封装到结果集中
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

5、带条件查询

	/**
	 * 条件查询
	 * 	hibernate中参数占位符的索引是从0开始的
	 */
	@Test
	public void test2(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("from Customer where custIndustry like ?  and custName like ? ");
		//2.给参数占位符赋值
		query.setString(0, "%修%");
		query.setString(1, "%办公%");
		//3.把查询结果封装到结果集中
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}
	
	
	/**
	 * 条件查询的第二种提供占位符的方式
	 * 具名查询:
	 * 	具名:给参数提供一个具体的名称,而不是用问号作为占位符
	 * 提供名称的规则:
	 * 		:名称
	 * 给占位符赋值:
	 * 		直接写具体的名称。不能写:
	 */
	@Test
	public void test3(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("from Customer where custIndustry like :a  and custName like :custName ");
		//2.给参数占位符赋值
		query.setString("custName", "%修%");
		query.setString("a", "%办公%");
		//3.把查询结果封装到结果集中
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

6、排序查询

关键字:order  by

	/**
	 * 排序查询
	 * 
	 * 关键字:
	 * 		order by
	 * 升序:
	 * 		asc 默认值
	 * 降序
	 * 		desc 
	 */
	@Test
	public void test4(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("from Customer order by custId desc ");
		//2.把查询结果封装到结果集中
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

7、分页查询

hibernate中提供了两个方法分别放起始页,和每页显示条数

	/**
	 * 分页查询
	 * 
	 * mysql分页的关键字:
	 * 		limit
	 * limit关键字有两个参数
	 * 		第一个参数:查询的开始记录索引,从0开始
	 * 		第二个参数:每次查询多少条记录。
	 * 在hibernate中它提供了两个方法:
	 * 		setFirstResult();此方法用于设置开始记录索引
	 * 		setMaxResults();此方法用于设置每次查询的条数
	 */
	@Test
	public void test5(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("from Customer");
		//2.设置分页的条件
		query.setFirstResult(2);
		query.setMaxResults(2);
		//3.把查询结果封装到结果集中
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

8、HQL中聚合函数的用法

注意:在使用聚合函数时,没有group by子句的情况下,返回的结果都是一行一列的。

	/**
	 * HQL中的聚合函数用法:
	 * 	明确:
	 * 		在使用聚合函数时,没有group by子句的情况下,返回的结果都是一行一列的。
	 * 聚合函数:
	 * 	count
	 * 	max
	 *  min
	 *  avg
	 *  sum
	 */
	@Test
	public void test6(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("select count(custId) from Customer");
		//2.获取结果集
		Object obj = query.uniqueResult();
		System.out.println(obj);
		tx.commit();
	}

9、投影查询

什么是投影查询:

        我们查询一个实体列表时,并不是获取所有字段的信息,只是部分字段。但是还要把部分字段的信息重新封装到实体类中。就叫做创建实体类的投影。

使用要求:

        HQL要求:语句中必须有 new 关键词

                select new cn.itcast.domain.Customer(custId,custName) from Customer;

        实体类要求:必须生成对应参数列表的构造函数

	/**
	 * 投影查询:
	 * 	 我们查询一个实体列表时,并不是获取所有字段的信息,只是部分字段。
	 * 	但是还要把部分字段的信息重新封装到实体类中。
	 *  就叫做创建实体类的投影。
	 * 使用要求:
	 * 	1、HQL语句:
	 * 		select new cn.itcast.domain.Customer(custId,custName) from Customer;
	 *  2、实体类要求:
	 *  	必须生成对应参数列表的构造函数
	 */
	@Test
	public void test7(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Query对象
		Query query = s.createQuery("select new Customer(custId,custName) from Customer");
		//2.获取结果集
		/*List<Object[]> list = query.list();
		for(Object[] os : list){
			System.out.println("数组中的内容-------------------");
			for(Object o : os){
				System.out.println(o);
			}
		}*/
		
		List list = query.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

三、Criteria对象的查询

1、涉及的对象

       Criteria对象

2、如何获取对象

        session.createCriteria(Class clazz);

3、参数的含义

        要查询的实体类字节码对象

4、QBC查询

        使用Criteria对象查询,Query By Criteria

        特点:一句SQL语句或者HQL语句都不需要。是把生成语句的过程都通过调用方法来表现出来了。凡是能用HQL查询的,QBC都能查,反之亦然。

5、查询所有

	/**
	 * 查询所有客户
	 */
	@Test
	public void test1(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Criteria对象
		Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
		//2.获取结果集
		List list = c.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

6、条件查询

	/**
	 * 条件查询
	 */
	@Test
	public void test2(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Criteria对象
		Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
		//2.设置查询条件
		c.add(Restrictions.like("custName", "%修%"));//from Customer where custName like '%修%'
		c.add(Restrictions.eq("custIndustry","商业办公"));
		//3.获取结果集
		List list = c.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

7、排序查询

	/**
	 * 排序查询
	 */
	@Test
	public void test3(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Criteria对象
		Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
		//2.设置排序
		c.addOrder(Order.desc("custId"));
		//3.获取结果集
		List list = c.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

8、分页查询

	/**
	 * 分页查询
	 * 	它和HQL语句所涉及的方法是一模一样的
	 * 
	 */
	@Test
	public void test4(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Criteria对象
		Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
		//2.设置分页的条件
		c.setFirstResult(2);
		c.setMaxResults(2);
		//3.获取结果集
		List list = c.list();
		for(Object o : list){
			System.out.println(o);
		}
		tx.commit();
	}

9、统计查询

	/**
	 * 统计查询(在QBC中使用聚合函数)
	 */
	@Test
	public void test5(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		//1.获取Criteria对象
		Criteria c = s.createCriteria(Customer.class);//此行就相当于hql的from Customer
		//2.在Criteria对象中设置Projection
		c.setProjection(Projections.count("custId"));
		//3.获取结果集
		Object obj = c.uniqueResult();
		System.out.println(obj);
		tx.commit();
	}

四、QBC常用条件查询说明





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值