hql 学习

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 list = new ArrayList();
		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);
		}
	}

 

你可能感兴趣的:(Study)