hibernate检索方式与检索策略

原创 2017年01月02日 21:13:03

一、打开oracle登录scott账户,查询emp表的全部数据


二、打开MyEclipse,创建一个java项目为hibernate_retrieval,添加包、hibernate配置文件、hibernate映射文件

三、测试hibernate的检索方式与检索策略

1.主方法

	public static void main(String[] args) {
//		t1();//通过"FROM Emp"HQL语句查询scott账户下emp表的全部数据
//		t2();//通过"SELECT e FROM Emp e"HQL语句查询scott账户下emp表的全部数据
//		t3();//通过"SELECT e FROM Emp e WHERE e.comm IS NULL"HQL语句查询scott账户下emp表comm为空的全部数据
//		t4();//通过HQL语句查询emp表的全部数据,并且sal,empno降序排列
//		t5();//查询emp表中job为CLERK,deptno为20的全部员工,且sal,empno降序排列
//		t6();//查询emp表中ename第三个字符为'O'的员工
//		t7();//查询emp表中ename第二个字符为'O'的所有员工
//		t8();//查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0(按参数位置绑定)
//		t9();//查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0(按参数名字绑定)
//		t10();//通过HQL投影查询emp表中的ename(将每条查询结果封装成Object对象)
//		t11();//通过HQL投影查询emp表中的ename,job(将每条查询结果封装成Object数组)
		t12();//通过HQL投影查询emp表中的ename,job(将每条查询结果通过构造函数封装成对象)
	}
2.测试方法一

	/**
	 * 通过"FROM Emp"HQL语句查询scott账户下emp表的全部数据<br/>
	 * 执行HQL语句的步骤:<br/>
	 * 1. 获取Session对象<br/>
	 * 2. 编写HQL语句;<br/>
	 * 3. 创建Query对象;<br/>
	 * 4. 执行查询,得到查询结果<br/>
	 */
	private static void t1() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "FROM Emp";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
					+ e.getSal());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();

	}
运行:

3.测试方法二

	/**
	 * 通过"SELECT e FROM Emp e"HQL语句查询scott账户下emp表的全部数据 <br/>
	 * 执行HQL 语句的步骤:<br/>
	 * 1. 获取Session对象<br/>
	 * 2. 编写HQL语句;<br/>
	 * 3. 创建Query对象;<br/>
	 * 4. 执行查询,得到查询结果<br/>
	 */
	private static void t2() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
					+ e.getSal());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

4.测试方法三

	/**
	 * 通过"SELECT e FROM Emp e WHERE e.comm IS NULL"HQL语句查询scott账户下emp表comm为空的全部数据 <br/>
	 * 执行HQL 语句的步骤:<br/>
	 * 1. 获取Session对象<br/>
	 * 2. 编写HQL语句;<br/>
	 * 3. 创建Query对象;<br/>
	 * 4. 执行查询,得到查询结果<br/>
	 */
	private static void t3() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.comm IS NULL";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getComm());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

5.测试方法四

	/**
	 * 通过HQL语句查询emp表的全部数据,并且sal,empno降序排列
	 */
	private static void t4() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e ORDER BY e.sal DESC,e.empno DESC";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
					+ e.getSal());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

6.测试方法五

	/**
	 * 查询emp表中job为CLERK,deptno为20的全部员工,且sal,empno降序排列
	 */
	private static void t5() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.job='CLERK' AND e.dept.deptno=20 ORDER BY e.sal DESC,e.empno DESC";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
					+ e.getSal());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

7.测试方法六

	/**
	 * 查询emp表中ename第三个字符为'O'所有的员工
	 */
	private static void t6() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.ename LIKE '__O%'";
		Query query = session.createQuery(hql);
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t" 
					+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

8.测试方法七

	/**
	 * 查询emp表中ename第二个字符为'O'的所有员工<br/>
	 * 在HQL查询语句中绑定参数<br/>
	 * 方法一:按参数位置绑定<br/>
	 */
	private static void t7() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ?";
		Query query = session.createQuery(hql);
		query.setString(0, "_O%");
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t" 
					+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

9.测试方法八

	/**
	 * 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
	 * 在HQL查询语句中绑定参数<br/>
	 * 方法一:按参数位置绑定<br/>
	 */
	private static void t8() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ? AND e.sal > ?";
		Query query = session.createQuery(hql);
		query.setString(0, "_O%");
//		query.setDouble(1, 2999.0);
		query.setString(1, "2999.0");
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t" 
					+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

10.测试方法九

	/**
	 * 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
	 * 在HQL查询语句中绑定参数<br/>
	 * 方法二:按参数名字绑定<br/>
	 */
	private static void t9() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e FROM Emp e WHERE e.ename LIKE :n AND e.sal > :s";
		Query query = session.createQuery(hql);
		query.setString("n", "_O%");
//		query.setDouble("s", 2999.0);
		query.setString("s", "2999.0");
		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t" 
					+ e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

11.测试方法十

	/**
	 * 通过HQL投影查询emp表中的ename(将每条查询结果封装成Object对象)<br/>
	 * 
	 * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
	 * 将每条查询结果封装成Object对象<br/>
	 * 将每条查询结果封装成Object数组<br/>
	 * 将每条查询结果通过构造函数封装成对象<br/>
	 */
	private static void t10() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e.ename FROM Emp e";
		Query query = session.createQuery(hql);

		List<String> list = query.list();
		for (String ename : list) {
			System.out.println(ename);
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

12.测试方法十一

	/**
	 * 通过HQL投影查询emp表中的ename,job(将每条查询结果封装成Object数组)<br/>
	 * 
	 * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
	 * 将每条查询结果封装成Object对象<br/>
	 * 将每条查询结果封装成Object数组<br/>
	 * 将每条查询结果通过构造函数封装成对象<br/>
	 */
	private static void t11() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		// Emp是类名,不是表名,大小写是敏感的,一个字都不能错
		String hql = "SELECT e.ename,e.job FROM Emp e";
		Query query = session.createQuery(hql);

		List<Object[]> list = query.list();
		for (Object[] obj : list) {
			System.out.println(obj[0]+"\t\t"+obj[1]);
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

13.测试方法十二

	/**
	 * 通过HQL投影查询emp表中的ename,job(将每条查询结果通过构造函数封装成对象)<br/>
	 * 
	 * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
	 * 将每条查询结果封装成Object对象<br/>
	 * 将每条查询结果封装成Object数组<br/>
	 * 将每条查询结果通过构造函数封装成对象<br/>
	 */
	private static void t12() {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();

		//使用new Emp(e.ename,e.job)时,需要在Emp类中重写构造方法,方法中含有ename,job这两个参数
		String hql = "SELECT new Emp(e.ename,e.job) FROM Emp e";
		Query query = session.createQuery(hql);

		List<Emp> list = query.list();
		for (Emp e : list) {
			System.out.println(e.getEname() + "\t\t" + e.getJob() 
					+ "\t\t" + e.getSal());//e.getSal在投影查询ename,job的情况下为空
		}

		transaction.commit();
		session.close();
		sessionFactory.close();
	}
运行:

四、小结

HQL(Hibernate Query Language)是面向对象的查询语句

执行HQL语句的步骤:
1. 获取Session对象
2. 编写HQL语句;
3. 创建Query对象;
4. 执行查询,得到查询结果

HQL语句中绑定参数的形式有两种:
按参数位置绑定
按参数名字绑定

HQL投影查询是查询一个持久化类的一个或多个属性值
将每条查询结果封装成Object对象
将每条查询结果封装成Object数组
将每条查询结果通过构造函数封装成对象

HQL支持投影查询、参数查询、分页查询等功能


ok,告一段落了,还有分页查询没有演示,我准备以后单独测试分页查询,所以就没有写。

好了,休息了^_^








版权声明:本文为博主原创文章,未经博主允许不得转载。

Java程序员从笨鸟到菜鸟之(六十三)细谈Hibernate(十四)Hibernate三种检索方式详解

Hibernate检索机制中主要分为三种,他们各自有各自的好处和缺点,他主要分为以下三种: 1.立即检索策略  2.延迟检索策略  3.左外连接检索策略  立即加载:首先我们来看一下立...
  • csh624366188
  • csh624366188
  • 2012年05月30日 10:55
  • 6656

Hibernate检索策略与检索方式

Hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用。但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大...
  • happylee6688
  • happylee6688
  • 2013年12月20日 10:58
  • 2480

Hibernate(十四)Hibernate三种检索方式详解

Hibernate检索机制中主要分为三种,他们各自有各自的好处和缺点,他主要分为以下三种: 1.立即检索策略  2.延迟检索策略  3.左外连接检索策略  立即...
  • u014654942
  • u014654942
  • 2014年08月21日 14:12
  • 1401

Hibernate三种检索策略的优缺点对比

1立即检索; 优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象; 缺点:1.select语句太多;2.可能会加载应用程序不需要访问...
  • hw20070575
  • hw20070575
  • 2016年03月07日 16:57
  • 392

Hibernate检索策略和检索方式

1 Hibernate的检索策略 Hibernate的检索策略分为两个级别: 类级别的检索策略:立即检索、延迟检索。关联级别的检索策略:立即检索、延迟检索还是迫切左外连接检索。 注意:在类级...
  • sunzhifeng1989
  • sunzhifeng1989
  • 2014年01月23日 12:24
  • 690

Hibernate的检索(抓取)策略

1、 建立模拟数据  ---- 建立3个Customer 和 30个Order(每个客户10个订单) 2、 立即检索和延迟检索          立即检索: 立即加载检索方法指定的对象    ...
  • u011428274
  • u011428274
  • 2013年07月22日 09:31
  • 1170

Hibernate】Hibernate的检索策略:lazy、fetch

http://blog.csdn.net/vking_wang/article/details/8742573 原作者 检索策略 1、类级别和关联级别 ...
  • huchunbin
  • huchunbin
  • 2013年09月28日 20:00
  • 2646

Hibernate的几种主要检索方式

本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是Hibernate Query Language的缩写,是官方推荐的查询语言。QBC是Que...
  • u012189294
  • u012189294
  • 2014年11月04日 17:03
  • 2177

Hibernate:5种检索方式

HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2015年12月07日 08:14
  • 986

Hibernate中的五种数据检索方式

Hibernate检索数据的五种方式: 1.导航对象图检索方式。(根据已经加载的对象,导航到其他对象。) 2.OID检索方式。(按照对象的OID来检索对象。) 3.HQL检索方式。(使用面向对象...
  • stupid_Java_learner
  • stupid_Java_learner
  • 2016年08月12日 14:31
  • 2237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate检索方式与检索策略
举报原因:
原因补充:

(最多只允许输入30个字)