IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> hibernate之HQL -> 正文阅读

[Java知识库]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();

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:21:41  更:2021-10-20 12:23:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:27:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码