hibernate检索方式与检索策略

缺乏、安全感 2022-07-13 08:40 329阅读 0赞

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

20170102211424263

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

20170102211744487

20170102211849989

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

1.主方法

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

2.测试方法一

  1. /**
  2. * 通过"FROM Emp"HQL语句查询scott账户下emp表的全部数据<br/>
  3. * 执行HQL语句的步骤:<br/>
  4. * 1. 获取Session对象<br/>
  5. * 2. 编写HQL语句;<br/>
  6. * 3. 创建Query对象;<br/>
  7. * 4. 执行查询,得到查询结果<br/>
  8. */
  9. private static void t1() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  15. String hql = "FROM Emp";
  16. Query query = session.createQuery(hql);
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  20. + e.getSal());
  21. }
  22. transaction.commit();
  23. session.close();
  24. sessionFactory.close();
  25. }

运行: 20170102212325900

3.测试方法二

  1. /**
  2. * 通过"SELECT e FROM Emp e"HQL语句查询scott账户下emp表的全部数据 <br/>
  3. * 执行HQL 语句的步骤:<br/>
  4. * 1. 获取Session对象<br/>
  5. * 2. 编写HQL语句;<br/>
  6. * 3. 创建Query对象;<br/>
  7. * 4. 执行查询,得到查询结果<br/>
  8. */
  9. private static void t2() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  15. String hql = "SELECT e FROM Emp e";
  16. Query query = session.createQuery(hql);
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  20. + e.getSal());
  21. }
  22. transaction.commit();
  23. session.close();
  24. sessionFactory.close();
  25. }

运行: 20170102212911300

4.测试方法三

  1. /**
  2. * 通过"SELECT e FROM Emp e WHERE e.comm IS NULL"HQL语句查询scott账户下emp表comm为空的全部数据 <br/>
  3. * 执行HQL 语句的步骤:<br/>
  4. * 1. 获取Session对象<br/>
  5. * 2. 编写HQL语句;<br/>
  6. * 3. 创建Query对象;<br/>
  7. * 4. 执行查询,得到查询结果<br/>
  8. */
  9. private static void t3() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  15. String hql = "SELECT e FROM Emp e WHERE e.comm IS NULL";
  16. Query query = session.createQuery(hql);
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEmpno() + "\t\t" + e.getComm());
  20. }
  21. transaction.commit();
  22. session.close();
  23. sessionFactory.close();
  24. }

运行: 20170102213030852

5.测试方法四

  1. /**
  2. * 通过HQL语句查询emp表的全部数据,并且sal,empno降序排列
  3. */
  4. private static void t4() {
  5. Configuration config = new Configuration().configure();
  6. SessionFactory sessionFactory = config.buildSessionFactory();
  7. Session session = sessionFactory.openSession();
  8. Transaction transaction = session.beginTransaction();
  9. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  10. String hql = "SELECT e FROM Emp e ORDER BY e.sal DESC,e.empno DESC";
  11. Query query = session.createQuery(hql);
  12. List<Emp> list = query.list();
  13. for (Emp e : list) {
  14. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  15. + e.getSal());
  16. }
  17. transaction.commit();
  18. session.close();
  19. sessionFactory.close();
  20. }

运行: 20170102213122334

6.测试方法五

  1. /**
  2. * 查询emp表中job为CLERK,deptno为20的全部员工,且sal,empno降序排列
  3. */
  4. private static void t5() {
  5. Configuration config = new Configuration().configure();
  6. SessionFactory sessionFactory = config.buildSessionFactory();
  7. Session session = sessionFactory.openSession();
  8. Transaction transaction = session.beginTransaction();
  9. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  10. String hql = "SELECT e FROM Emp e WHERE e.job='CLERK' AND e.dept.deptno=20 ORDER BY e.sal DESC,e.empno DESC";
  11. Query query = session.createQuery(hql);
  12. List<Emp> list = query.list();
  13. for (Emp e : list) {
  14. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  15. + e.getSal());
  16. }
  17. transaction.commit();
  18. session.close();
  19. sessionFactory.close();
  20. }

运行: 20170102213213477

7.测试方法六

  1. /**
  2. * 查询emp表中ename第三个字符为'O'所有的员工
  3. */
  4. private static void t6() {
  5. Configuration config = new Configuration().configure();
  6. SessionFactory sessionFactory = config.buildSessionFactory();
  7. Session session = sessionFactory.openSession();
  8. Transaction transaction = session.beginTransaction();
  9. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  10. String hql = "SELECT e FROM Emp e WHERE e.ename LIKE '__O%'";
  11. Query query = session.createQuery(hql);
  12. List<Emp> list = query.list();
  13. for (Emp e : list) {
  14. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  15. + e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
  16. }
  17. transaction.commit();
  18. session.close();
  19. sessionFactory.close();
  20. }

运行: 20170102213256696

8.测试方法七

  1. /**
  2. * 查询emp表中ename第二个字符为'O'的所有员工<br/>
  3. * 在HQL查询语句中绑定参数<br/>
  4. * 方法一:按参数位置绑定<br/>
  5. */
  6. private static void t7() {
  7. Configuration config = new Configuration().configure();
  8. SessionFactory sessionFactory = config.buildSessionFactory();
  9. Session session = sessionFactory.openSession();
  10. Transaction transaction = session.beginTransaction();
  11. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  12. String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ?";
  13. Query query = session.createQuery(hql);
  14. query.setString(0, "_O%");
  15. List<Emp> list = query.list();
  16. for (Emp e : list) {
  17. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  18. + e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
  19. }
  20. transaction.commit();
  21. session.close();
  22. sessionFactory.close();
  23. }

运行: 20170102213346508

9.测试方法八

  1. /**
  2. * 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
  3. * 在HQL查询语句中绑定参数<br/>
  4. * 方法一:按参数位置绑定<br/>
  5. */
  6. private static void t8() {
  7. Configuration config = new Configuration().configure();
  8. SessionFactory sessionFactory = config.buildSessionFactory();
  9. Session session = sessionFactory.openSession();
  10. Transaction transaction = session.beginTransaction();
  11. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  12. String hql = "SELECT e FROM Emp e WHERE e.ename LIKE ? AND e.sal > ?";
  13. Query query = session.createQuery(hql);
  14. query.setString(0, "_O%");
  15. // query.setDouble(1, 2999.0);
  16. query.setString(1, "2999.0");
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  20. + e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
  21. }
  22. transaction.commit();
  23. session.close();
  24. sessionFactory.close();
  25. }

运行: 20170102213437431

10.测试方法九

  1. /**
  2. * 查询emp表中ename第二个字符为'O'的所有员工,且sal>2999.0<br/>
  3. * 在HQL查询语句中绑定参数<br/>
  4. * 方法二:按参数名字绑定<br/>
  5. */
  6. private static void t9() {
  7. Configuration config = new Configuration().configure();
  8. SessionFactory sessionFactory = config.buildSessionFactory();
  9. Session session = sessionFactory.openSession();
  10. Transaction transaction = session.beginTransaction();
  11. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  12. String hql = "SELECT e FROM Emp e WHERE e.ename LIKE :n AND e.sal > :s";
  13. Query query = session.createQuery(hql);
  14. query.setString("n", "_O%");
  15. // query.setDouble("s", 2999.0);
  16. query.setString("s", "2999.0");
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEmpno() + "\t\t" + e.getEname() + "\t\t"
  20. + e.getJob() + "\t\t" + e.getSal() + "\t\t" + e.getComm());
  21. }
  22. transaction.commit();
  23. session.close();
  24. sessionFactory.close();
  25. }

运行: 20170102213532197

11.测试方法十

  1. /**
  2. * 通过HQL投影查询emp表中的ename(将每条查询结果封装成Object对象)<br/>
  3. *
  4. * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
  5. * 将每条查询结果封装成Object对象<br/>
  6. * 将每条查询结果封装成Object数组<br/>
  7. * 将每条查询结果通过构造函数封装成对象<br/>
  8. */
  9. private static void t10() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  15. String hql = "SELECT e.ename FROM Emp e";
  16. Query query = session.createQuery(hql);
  17. List<String> list = query.list();
  18. for (String ename : list) {
  19. System.out.println(ename);
  20. }
  21. transaction.commit();
  22. session.close();
  23. sessionFactory.close();
  24. }

运行: 20170102213643215

12.测试方法十一

  1. /**
  2. * 通过HQL投影查询emp表中的ename,job(将每条查询结果封装成Object数组)<br/>
  3. *
  4. * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
  5. * 将每条查询结果封装成Object对象<br/>
  6. * 将每条查询结果封装成Object数组<br/>
  7. * 将每条查询结果通过构造函数封装成对象<br/>
  8. */
  9. private static void t11() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. // Emp是类名,不是表名,大小写是敏感的,一个字都不能错
  15. String hql = "SELECT e.ename,e.job FROM Emp e";
  16. Query query = session.createQuery(hql);
  17. List<Object[]> list = query.list();
  18. for (Object[] obj : list) {
  19. System.out.println(obj[0]+"\t\t"+obj[1]);
  20. }
  21. transaction.commit();
  22. session.close();
  23. sessionFactory.close();
  24. }

运行: 20170102213725183

13.测试方法十二

  1. /**
  2. * 通过HQL投影查询emp表中的ename,job(将每条查询结果通过构造函数封装成对象)<br/>
  3. *
  4. * HQL投影查询是查询一个持久化类的一个或多个属性值<br/>
  5. * 将每条查询结果封装成Object对象<br/>
  6. * 将每条查询结果封装成Object数组<br/>
  7. * 将每条查询结果通过构造函数封装成对象<br/>
  8. */
  9. private static void t12() {
  10. Configuration config = new Configuration().configure();
  11. SessionFactory sessionFactory = config.buildSessionFactory();
  12. Session session = sessionFactory.openSession();
  13. Transaction transaction = session.beginTransaction();
  14. //使用new Emp(e.ename,e.job)时,需要在Emp类中重写构造方法,方法中含有ename,job这两个参数
  15. String hql = "SELECT new Emp(e.ename,e.job) FROM Emp e";
  16. Query query = session.createQuery(hql);
  17. List<Emp> list = query.list();
  18. for (Emp e : list) {
  19. System.out.println(e.getEname() + "\t\t" + e.getJob()
  20. + "\t\t" + e.getSal());//e.getSal在投影查询ename,job的情况下为空
  21. }
  22. transaction.commit();
  23. session.close();
  24. sessionFactory.close();
  25. }

运行: 20170102213814576

四、小结

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

执行HQL语句的步骤:

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

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

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

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

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

好了,休息了^_^

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate检索策略

    检索策略追求的两个目标是:(以客户和订单的例子说明) 不浪费内存:当Hibernate从数据库中加载Customer对象时,如果同时加载所有关联的Order对象,而程序

    相关 Hibernate检索策略

           有一对有关联关系的对象A和B,在运行Query.list()方法时,先查出A记录,然后遍历A的id去B中查询。这种策略为立即检索策略。这种策略有两处缺点。一处是s