hql 学习

本文深入解析Hibernate Query Language(HQL),对比HQL与SQL的区别,详细介绍HQL查询的五种返回结果方式,包括对象、字符串、Object数组、Map及构造方法返回对象。同时,探讨HQL中占位符的使用、连接查询、聚合函数、分页等高级主题。

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

1.什么是hql

      HQL是   Hibernate Query Language  的缩写, 是适用于  hibernate 的 查询语句

 

2. hql和sql区别/异同

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

 

3. 处理返回的结果集

  3.1 hql处理情况1,返回对象 

/**
	 * 通过singleResult查询单个结果集
	 * hql处理情况1,返回对象
	 */
	@Test
	public void singleObj() {
		String hql = "from User where id = 1";
		Query query = session.createQuery(hql);
		Object obj = query.getSingleResult();
		System.out.println(obj);
	}

 3.2 hql处理情况2,返回 字符串

/**
	 * 通过singleResult查询单个结果集
	 * 查询单个列段
	 * hql处理情况2,返回字符串
	 */
	@Test
	public void singleObj0() {
		String hql = "select userName from User where id = 1";
		Query query = session.createQuery(hql);
		Object obj = query.getSingleResult();
		System.out.println(obj);
	}

 3.3 hql处理情况3,返回 Object [ ] 

/**
	 * 查询多个列段
	 * hql处理情况3,返回数组
	 */
	@Test
	public void singleObj00() {
		String hql = "select userName,realName from User where id = 1";
		Query query = session.createQuery(hql);
		List list = query.list();
		for (Object obj : list) {
			System.out.println(obj);
		}
	}

 3.4 hql处理情况4,返回 Map

/**
	 * 通过singleResult查询单个结果集
	 * 语句实例化map, 查处结果用HashMap集合结构输出
	 * 属性名可通过 as 自定义名称,如未自定义则按下标从0开始,给值添加键名称
	 * hql处理情况4,返回Map
	 */
	@Test
	public void singleObj3() {
		String hql = "select new map(userName as a, userPwd as b) from User where id = 1";
		Query query = session.createQuery(hql);
		Object obj = query.getSingleResult();
		System.out.println(obj);
	}

3.5 hql处理情况5,使用new 构造方法(attr1,attr2) 返回对象

/**
	 * 通过ResultList查询多个结果集或集合
	 * 使用构造器,查询相应值
	 * hql处理情况5、查询多个列段,返回对象
	 */
	@Test
	public void singleObj5() {
		String hql = "select new User(userName, realName) from User";
		Query query = session.createQuery(hql);
		List resultList = query.getResultList();
		for (Object obj : resultList) {
			System.out.println(obj);
		}
	}

 

4. hql中使用占位符

       ?占位符    ,   : 命名参数

/**
	 * hql 命名参数
	 *  ? 占位符 来描述查询条件的参数下标以及参数值    注:hibernate5之后不再支持占位符
	 *  : + 字符    :命名参数   来描述一个参数的值
	 */
	@Test
	public void singleObj2() {
//		String hql = "from User where id = :id";
		String hql = " from User where id in :ids";
		Query query = session.createQuery(hql);
		//		query.setParameter("id", new Integer(1));
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		query.setParameterList("ids", list);
//		Object singleResult = query.getResultList();
//		System.out.println(singleResult);
		List list2 = query.list();
		for (Object objs : list2) {
			System.out.println(objs);
		}
	}

注 : ?占位符 , hibernate5 之后不再支持?占位符

 

5. 连接查询

/**
	 * 连接查询  与   SQL 相似 
     *  这里使用Map返回
	 */
	@Test
	public void singleObj6() {
		String hql = "select new map(o.order_no, oi.product_id) from Order o,OrderItem oi where o = oi.order";
		Query query = session.createQuery(hql);
		List resultList = query.getResultList();
		for (Object obj : resultList) {
			System.out.println(obj);
		}
	}

 

6. 聚合函数

/**
	 * 聚合函数,与Sql使用相似
	 * 获取到的是单个对象
	 */
	@Test
	public void singleObj7() {
		String hql = "select count(*) from User";
		Query query = session.createQuery(hql);
		Object obj = query.getSingleResult();
		System.out.println(obj);
	}

 

7.分页

  提供两个方法  setFirstResult(  起始页 ),setMaxResults( 显示多少条数据 ),下列以   MySql  为例

/**
	 * 分页
	 * 通过ResultList查询多个结果集或集合
	 * 查询第二页数据,每页显示一条数据
	 */
	@Test
	public void singleObj8() {
		String hql = " from User";
		Query query = session.createQuery(hql);
		int page = 2;
		int rows = 1;
		query.setFirstResult((page-1)*rows);
		query.setMaxResults(rows);
		List list = query.list();
		for (Object obj : list) {
			System.out.println(obj);
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值