hibernate之hql查询语言

HQL(Hibernate Query Language)是面向对象的查询语言, 它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中, HQL 是使用最广的一种检索方式,它有如下功能:

  1. 在查询语句中设定各种查询条件
  2. 支持投影查询,即仅检索出对象的部分属性
  3. 支持分页查询
  4. 支持连接查询
  5. 支持分组查询,允许使用HAVING和GROUP BY关键字
  6. 提供内置聚集函数,如sum()、min()和max()
  7. 支持子查询
  8. 支持动态绑定参数
  9. 能够调用用户定义的SQL函数或标准的SQL函数

实现HQL查询包括以下步骤

  1. 获取Hibernate Session对象
  2. 编写HQL语句
  3. 以HQL语句作为参数,调用Session的createQuery方法创建查询对象
  4. 如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值
  5. 调用Query对象的list()或uniqueResult()方法返回查询结果列表(持久化实体集)

 HQL查询实例

private Session session;
private Transaction transaction;

@Before
public void before() {
	session = SessionFactoryUtil.getSession();
	transaction = session.beginTransaction();
}

@After
public void after() {
	transaction.commit();
	SessionFactoryUtil.closeSession();
}

/**
 * 情况一:结果返回对象(用该对象的集合接收)
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:01:50
 */
@Test
public void test1() {
	String hql="from Book";//Book是实体类名
	Query query = session.createQuery(hql);
	List<Book> list = query.list();
	for (Book book : list) {
		System.out.println(book);
	}
}

查询结果打印如下:

/**
 * 情况二:查数据库表中的一列(用该列的数据类型的集合接收)
 * 数据库:在数据库表中查询,是不区分大小写
 * hql:由于你查询的是实体类的属性,那么就区分大小写了
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:27:18
 */
@Test
public void test2() {
	String hql="select bookName from Book";//bookName是实体类里的属性名
	Query query = session.createQuery(hql);
	List<String> list = query.list();
	for (String string : list) {
		System.out.println(string);
	}
}

查询结果打印如下:

/**
 * 情况三:查数据库表中的多列(用object数组集合接收,但推荐用List<Map>接收)
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:28:42
 */
@Test
public void test3() {
	String hql="select bookName,bookId from Book";
	Query query = session.createQuery(hql);
	List<Object[]> list = query.list();
	for (Object[] obj : list) {
		System.out.println(Arrays.toString(obj));
	}
}

查询结果打印如下:

/**
 * 情况四:通过hibernate函数Map去处理(用List<Map>接收)
 * 函数这个词是源自于数据库
 * 函数不区分大小写
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:37:30
 */
@Test
public void test4() {
	String hql="select new map(bookName,bookId) from Book";
	Query query = session.createQuery(hql);
	List<Map> list = query.list();
	for (Map obj : list) {
		System.out.println(obj);
	}
}

查询结果打印如下:

/**
 * 情况五:通过构造方法进行查询(前提是该实体类里必须要有该构造方法,否则会报错)
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:40:06
 */
@Test
public void test5() {
	String hql="select new Book(bookId,bookName) from Book";
	Query query = session.createQuery(hql);
	List<Book> list = query.list();
	for (Book obj : list) {
		System.out.println(obj);
	}
}

查询结果打印如下:

/**
 * hibernate中的占位符问题
 * hibernate5版本以后弃用“?”
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:42:46
 */
@Test
public void test6() {
	String hql="from Book where bookId = :id";
	Query query = session.createQuery(hql);
	query.setParameter("id", 3);//用占位符传一个参数,查询ID为3的书籍
	Book book = (Book) query.getSingleResult();
	System.out.println(book);
}

查询结果打印如下:

/**
 * 用占位符传多个参数(查ID为1和3的书籍)
 * @author LJ
 * @Date 2018年10月30日
 * @Time 下午1:02:18
 */
@Test
public void test7() {
	String hql="from Book where bookId in (:ids)";
	Query query = session.createQuery(hql);
	/*
	 * 写法一
	 */
//		query.setParameterList("ids", new Integer[] {1,3});
	List<Integer> ids=new ArrayList<Integer>();
	ids.add(1);
	ids.add(3);
	/*
	 * 写法二
	 */
	query.setParameterList("ids", ids);
	List<Book> list = query.list();
	for (Book book : list) {
		System.out.println(book);
	}
}

查询结果打印如下:

/**
 * 联表查询(查订单和订单项)
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:51:15
 */
@Test
public void test8() {
			//写法一
//		String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId=oi.order.orderId";
			//写法二
	String hql="select new map(o.orderNo,oi.productId) from Order o,OrderItem oi where o=oi.order";
	Query query = session.createQuery(hql);
	List<Map> list = query.list();
	for (Map map : list) {
		System.out.println(map);
	}
}

查询结果打印如下:

/**
 * 聚合函数(查书籍价格的平均数)
 * @author LJ
 * @Date 2018年10月29日
 * @Time 上午11:59:33
 */
@Test
public void test9() {
	String hql="select avg(price) from Book";
	Object singleResult = session.createQuery(hql).getSingleResult();
	System.out.println(singleResult);
}

查询结果打印如下:

/**
 * 分页
 * @author LJ
 * @Date 2018年10月29日
 * @Time 下午12:00:55
 */
@Test
public void test10() {
	String hql="from Book";
	Query query = session.createQuery(hql);
	int page=2;//查第二页的数据
	int ofset=2;//每页显示2条数据
	query.setFirstResult((page-1)*ofset);//设置起始记录下标
	query.setMaxResults(ofset);//设置返回的最大结果集
	List<Book> list = query.list();
	for (Book book : list) {
		System.out.println(book);
	}
}

查询结果打印如下:

总结HQL  vs  SQL

HQL查询语句是面向对象的,Hibernate负责解析HQL查询语句,然后根据对象-关系映射文件中的映射信息,把HQL查询语句翻译成相应的SQL语句;HQL查询语句中的主体是域模型中的类及类的属性

SQL查询语句是与关系数据库绑定在一起的;SQL查询语句中的主体是数据库表及表的字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值