hibernate之HQL语句(处理返回的结果集的各种案例)及HQL与SQL的区别

转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165.
本文出自 不怕报错 就怕不报错的小猿猿 的博客

1.什么是HQL

HQL是Hibernate Query Language(hibernate的查询语言)的缩写

2.hql和SQL区别/异同

HQLSQL
操作类名/属性操作表名/列名
区分大小写,关键字不区分大小写不区分大小写
别名别名 as a
?,从下标0开始计算位置(hibernate5之后不支持)?,从顺序1开始计算位置
:命名参数不支持:命名参数
面向对象的查询语言面向结构查询语言

3.处理返回的结果集

3.1 单个对象

语法:select没有逗号

3.2 Object[]

语法:b.bookId, b.bookName

3.3 Map

语法:new Map(b.bookId as bid, b.bookName as bname)

3.4 new 构造方法(attr1,attr2)

语法:new Book(b.bookId, b.price)
单个列段

4. hql中使用占位符

4.1 ?占位符

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

4.2 :命名参数

5. 连接查询

6. 聚合函数

sum
avg
max
min
count

7. hql分页

int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集

8.案例(HqlTest.java 利用Junit测试,分开运行结果,上下代码能够全部衔接成一个类)

利用上一次的实体类及数据库表:链接: hibernate的关联关系(多对多),Vue菜单能用自关联之多对多查询案例那里.
共用部分:

public class HqlTest {
	private Session session;
	private Transaction transaction;
	private BookDao bookDao=new BookDao();
	
	@Before
	public void before() {
		session = SessionFactoryUtils.openSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void after() {
		transaction.commit();
		session.close();
	}

测试 返回对象(多个):

/**
 * 返回对象(多个)
 */
@Test
public void testList1() {
	Query query = session.createQuery("from Book");
	List<Book> list = query.list();
	for (Book b : list) {
		System.out.println(b);
	}
}

运行结果:
在这里插入图片描述

测试 返回单个列段,用字符串就可以接受:

/**
 * 返回单个列段,用字符串就可以接受
 */
@Test
public void testList2() {
	Query query = session.createQuery("select b.bookName as ss from Book b");
	List<String> list = query.list();
	for (String b : list) {
		System.out.println(b);
	}
}

运行结果:
在这里插入图片描述

测试 查两个列段及以上,默认返回的是Object【】:

/**
 * 查两个列段及以上,默认返回的是Object【】
 */
@Test
public void testList3() {
	Query query = session.createQuery("select b.bookId,b.bookName as ss from Book b");
	List<Object[]> list = query.list();
	for (Object[] b : list) {
		System.out.println(Arrays.toString(b));
	}
}

运行结果:

在这里插入图片描述

测试 返回是map集合:

/**
 * 注意map是函数,所以不区分大小写,返回的是map集合
 */
@Test
public void testList4() {
	Query query = session.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
	List<Map> list = query.list();
	for (Map b : list) {
		System.out.println(b);
	}
}

运行结果:
在这里插入图片描述

测试 查两个列段及以上,也可返回对象,前提是有对应的构造函数:

/**
 * 查两个列段及以上,也可返回对象,前提是有对应的构造函数
 */
@Test
public void testList5() {
	Query query = session.createQuery("select new Book(b.bookId,b.bookName) from Book b");
	List<Book> list = query.list();
	for (Book b : list) {
		System.out.println(b);
	}
}

运行结果:
在这里插入图片描述

测试 HQL语句支持占位符:

/**
 * HQL语句支持占位符
 */
@Test
public void testList6() {
//		Query query = session.createQuery("from Book where bookId = :bookId");
//		query.setParameter("bookId", 1);
//		Book b = (Book) query.getSingleResult();
//		System.out.println(b);
		
//		把Query当作preparestatement
		Query query = session.createQuery("from Book where bookId in (:bookIds)");
//		query.setParameterList("bookIds", new Integer[] {1,2,4});
		List<Integer> params = new ArrayList<Integer>();
		params.add(1);
		params.add(2);
		params.add(4);
		query.setParameterList("bookIds", params);
		List<Book> list = query.list();
		for (Book b : list) {
			System.out.println(b);
		}
	}

运行结果:
在这里插入图片描述

测试 HQL支持连接查询:

/**
 * HQL支持连接查询
 */
@Test
public void testList7() {
	Query query = session.createQuery("select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order");
	List<Object[]> list = query.list();
	for (Object[] b : list) {
		System.out.println(Arrays.toString(b));
	}
}

运行结果:
在这里插入图片描述

测试 HQL支持聚合函数:
/**
* HQL支持聚合函数
* sum
* count:返回单行单列
* avg
* max
*
/
@Test
public void testList8() {
Query query = session.createQuery("select count(
) from Book");
Long singleResult = (Long) query.getSingleResult();
System.out.println(singleResult);
}

运行结果(返回单行单列):
在这里插入图片描述

测试 HQL分页:

/**
 * HQL分页
 */
@Test
public void testList9() {
	Query query = session.createQuery("from Book");
	query.setFirstResult(5);
	query.setMaxResults(5);
	List<Book> list = query.list();
	for (Book b : list) {
		System.out.println(b);
	}
}

}
运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值