hibernate之HQL

1.HQL简介 

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

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

2.HQL与SQL区别

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

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

3.HQL使用

3.1实体查询

最简单实体查询例子

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

 3.2属性查询

有时,我们需要的数据可能仅仅是实体对象的某个属性(库表记录中的某个字段信息)。通过HQL可以简单的做到这一点。

/**
	 * 返回单个列段,用字符串就可以接受
	 */
	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);
		}
	}

上例中,我们指定只需要获取Book的name属性。返回的list数据结构中,每个条目都是一个String类型的name数据。 我们也可以通过一条HQL获取多个属性

/**
	 * 查两个列段及以上,默认返回的是Object【】
	 */
	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));
		}
	}

3.3map集合

将需要获取的属性放入map函数中即可。

/**
	 * 注意map是函数,所以不区分大小写,返回的是map集合
	 */
	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);
		}
	}

3.4对象封装

可以通过在HQL中动态的构造函数方法对这些数据进行封装。

/**
	 * 查两个列段及以上,也可返回对象,前提是有对应的构造函数
	 */
	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);
		}
	}

3.5HQL占位符

简单占位符使用

Query query = session.createQuery("from Book where bookId = :bookId");
query.setParameter("bookId", 1);
Book b = (Book) query.getSingleResult();
System.out.println(b);

多个占位符

Query query = session.createQuery("from Book where bookId in (:bookIds)");
		query.setParameterList("bookIds", new Integer[] {1,2,4});

3.6连表查询 

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

3.8HQL聚合函数与分页

/**
	 * HQL支持聚合函数
	 */
	public void testList8() {
		Query query = session.createQuery("select count(*) from Book");
		Long singleResult = (Long) query.getSingleResult();
		System.out.println(singleResult);
	}
	
	/**
	 * HQL分页
	 */
	public void testList9() {
		Query query = session.createQuery("from Book");
		//起始下标
		query.setFirstResult(2);
		//每页最大条数
		query.setMaxResults(3);
		List<Book> list = query.list();
		for (Book b : list) {
			System.out.println(b);
		}
	}

 4.基于hibernate通用分页查询

/**
	 * 通用查询
	 * @param path 配置文件
	 * @param hql  执行语句
	 * @param p  分页工具
	 */
	public void executeQuery(String path,String hql,PageBean p) {
		//1.对框架核心配置文件进行建模
		Configuration configure = new Configuration().configure(path);
		//2.获取sessionFactory工厂
		SessionFactory buildSessionFactory = configure.buildSessionFactory();
		 //3.获取session会话
		Session session = buildSessionFactory.openSession();
		//计算数据总条数hql
		Query createQuery = session.createQuery(getcount(hql));
		//将总条数赋值给PageBean的total
		p.setTotal(createQuery.getSingleResult().toString());
		//执行hql
		Query createQuery2 = session.createQuery(hql);
		//设置起始下标
		createQuery2.setFirstResult(p.getStartIndex());
		//设置最大每页条数
	  	createQuery2.setMaxResults(p.getRows());
	  	List list = createQuery2.list();
		for (Object object : list) {
			System.out.println(object);
		}
		session.close();
	}
	private String getcount(String hql) {
		//考虑用户传过来的hql语句可能大小写不同
		 String upperCase = hql.toUpperCase();
//		 System.out.println(upperCase);
		return "select count(*) "+hql.substring(upperCase.indexOf("FROM"));
	}

调用

PageBean p = new PageBean();
//设置每页条数
p.setRows(2);
new BaseDemo().executeQuery("/hibernate.cfg.xml", " from User where userName like '%z%'  ", p);

5.hibernate操作原生SQL 

//1.对框架核心配置文件进行建模
			Configuration configure = new Configuration().configure("/hibernate.cfg.xml");
			//2.获取sessionFactory工厂
			SessionFactory buildSessionFactory = configure.buildSessionFactory();
			 //3.获取session会话
			Session openSession = buildSessionFactory.openSession();
//			//4.session 操作对象
			/* 原生SQL */
            List list = openSession.createSQLQuery("select * from t_hibernate_user where user_name like '%z%' ").addEntity(User.class).list();
			/* HQL */
        // List list = openSession.createQuery(" select COUNT(1) from User where userName like '%z%' ").list();
			for (Object object : list) {
				System.out.println(object);
			}
//			//7.关闭session
			openSession.close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值