Hql(一):处理返回的结果集、联表查询以及分页

本文介绍了HQL的基础知识,包括处理返回的单个对象、Object[]、Map及通过构造方法创建实例。还探讨了HQL中的占位符,如?和命名参数。此外,详细阐述了如何进行连接查询和使用聚合函数(如sum、avg等)。最后,讲解了HQL实现分页查询的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hql学习①

一、 什么是hql

   1、含义:HQL是Hibernate Query Language的缩写
	2、hql和sql区别/异同
HQL【 面向对象的查询语言 】SQL【 面向结构查询语言】
类名/属性表名/列名
区分大小写,关键字不区分大小写不区分大小写
别名别名
?,从下标0开始计算位置(hibernate5之后不支持)?,从顺序1开始计算位置
:命名参数不支持:命名参数

二、 处理返回的结果集

1、单个对象
select没有逗号

/**
	 * 结果处理情况一:
	 * 	直接利用对象进行数据接受
	 */
	@Test
	public void testList1() {
		String hql = "from Book";
		Query query = session.createQuery(hql);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}
/**
	 * 结果处理情况五:
	 * 	查一列
	 * jdbc:查的是表中某列  列名不区分大小写
	 * hql:查的是实体类的某一属性  严格区分大小写 关键字不区分大小写
	 * 
	 */
	@Test
	public void testList2() {
		String hql = "select bookName from Book";
		List<String> list = session.createQuery(hql).list();
		for (String bname : list) {
			System.out.println(bname);
		}
	}

2、 Object[]

 /**
	 * 结果处理情况二:
	 * 	Object[]
	 * mvc——>EntityBaseDao.insert(sql,keys)
	 */
	@Test
	public void testList3() {
		String hql = "select bookId,bookName from Book";
		List<Object[]> list = session.createQuery(hql).list();
		for (Object[] book : list) {
			System.out.println(Arrays.toString(book));
		}
	}

3、Map
new Map(b.bookId as bid, b.bookName as bname)

/**
	 * 结果处理情况三:
	 * 利用hibernate内置的函数进行结果处理
	 */
	@Test
	public void testList4() {
		String hql = "select new map(bookId,bookName) from Book";
		List<Map> list = session.createQuery(hql).list();
		for (Map book : list) {
			System.out.println(book);
		}
	}

4、 new 构造方法(attr1,attr2)
new Book(b.bookId, b.price)

/**
	 * 结果处理情况四:
	 * 利用构造方法进行结果处理
	 * 1、当你给某一个类提供有参构造器,顺便加上无参构造器
	 * 2、构造方法赋值的原理(完善mvc框架的通用CRUD)
	 * 		
	 */
	@Test
	public void testList5() {
		String hql = "select new Book(bookId,bookName) from Book";
		List<Book> list = session.createQuery(hql).list();
		for (Book book : list) {
			System.out.println(book);
		}
	}

三、hql中使用占位符

1、?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符

2、 :命名参数

	/**
	 * hql中使用占位符
	 */
	@Test
	public void testList6() {
//		String hql = "from Book where bookId = :bookId";
//		Query query = session.createQuery(hql);
//		query.setParameter("bookId", 2);
//		Book book = (Book) query.getSingleResult();
//		System.out.println(book);
		
		
//		String hql = "from Book where price > :min and price < :max";
//		Query query = session.createQuery(hql);
//		query.setParameter("min", 120f);
//		query.setParameter("max", 200f);
//		List<Book> list = query.list();
//		for (Book book : list) {
//			System.out.println(book);
//		}
		
		String hql = "from Book where bookId in (:bookIds)";
		Query query = session.createQuery(hql);
//		query.setParameterList("bookIds", new Integer[] {2,3,4});
		List<Integer> params  = new ArrayList<Integer>();
		params.add(1);
		params.add(2);
		params.add(3);
		query.setParameterList("bookIds", params);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
		
	}

四、 连接查询 Object[]

	/**
	 * 联表查询:Object[]
	 */
	@Test
	public void testList7() {
//		String hql = "select o.OrderNo,oi.quantity from Order o,OrderItem oi where o.OrderId = oi.order.OrderId";
		String hql = "select o.OrderNo,oi.quantity from Order o,OrderItem oi where o = oi.order";
		Query query = session.createQuery(hql);
		List<Object[]> list = query.list() ;
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
	}

五、 聚合函数

sum
avg
max
min
count

/**
	 * 聚合函数
	 */
	@Test
	public void testList8() {
		String hql = "select count(*) from Book";
		Object result = session.createQuery(hql).getSingleResult();
		System.out.println(result);
	}

六、 hql分页

  /**
	 *hibernate中的分页
	 *query.setFirstResult((page - 1) * row);// 设置起始记录下标
  	* query.setMaxResults(row);// 设置返回的最大结果集    
	 */
	@Test
	public void testList9() {
		String hql = "from Book where bookName like :bookName";
		int rows = 2;
		int page = 1;
		Query query = session.createQuery(hql);
		query.setParameter("bookName", "%霸道%");
		query.setFirstResult((page-1)*rows);
		query.setMaxResults(rows);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值