一,HQL特点
- 与SQL相似,SQL中的语法基本上都可以直接使用。
- SQL查询的是表和表中的列;HQL查询的是对象与对象中的属性。
- HQL的关键字不区分大小写,类名与属性名是区分大小写的。
- SELECT可以省略.
二,简单查询
1 // 1,简单的查询 2 // hql = "FROM Employee"; 3 // hql = "FROM Employee AS e"; // 使用别名 4 // hql = "FROM Employee e"; // 使用别名,as关键字可省略 5 6 // 2,带上过滤条件的(可以使用别名):Where 7 // hql = "FROM Employee WHERE id<10"; 8 // hql = "FROM Employee e WHERE e.id<10"; 9 // hql = "FROM Employee e WHERE e.id<10 AND e.id>5"; 10 11 // 3,带上排序条件的:Order By 12 // hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name"; 13 // hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC"; 14 // hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC"; 15 16 // 4,指定select子句(不可以使用select *) 17 // hql = "SELECT e FROM Employee e"; // 相当于"FROM Employee e" 18 // hql = "SELECT e.name FROM Employee e"; // 只查询一个列,返回的集合的元素类型就是这个属性的类型 19 // hql = "SELECT e.id,e.name FROM Employee e"; // 查询多个列,返回的集合的元素类型是Object数组 20 // hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new语法,指定把查询出的部分属性封装到对象中 21 22 // 5,执行查询,获得结果(list、uniqueResult、分页 ) 23 // Query query = session.createQuery("FROM Employee e WHERE id<3"); 24 // query.setFirstResult(0); 25 // query.setMaxResults(10); 26 // // List list = query.list(); // 查询的结果是一个List集合 27 // Employee employee = (Employee) query.uniqueResult();// 查询的结果是唯一的一个结果,当结果有多个,就会抛异常 28 // System.out.println(employee); 29 30 // 6,方法链 31 List list = session.createQuery(// 32 "FROM Employee")// 33 .setFirstResult(0)// 34 .setMaxResults(10)// 35 .list(); 36 37 // // ----- 执行查询 38 // List list = session.createQuery(hql).list(); 39 // 40 // ----- 显示结果 41 for (Object obj : list) { 42 if (obj.getClass().isArray()) { 43 System.out.println(Arrays.toString((Object[]) obj)); 44 } else { 45 System.out.println(obj); 46 } 47 } 48 49 // -------------------------------------------- 50 session.getTransaction().commit(); 51 session.close();
三,复杂查询
1 // 1,聚集函数:count(), max(), min(), avg(), sum() 2 // hql = "SELECT COUNT(*) FROM Employee"; // 返回的结果是Long型的 3 // hql = "SELECT min(id) FROM Employee"; // 返回的结果是id属性的类型 4 // Number result = (Number) session.createQuery(hql).uniqueResult(); 5 // System.out.println(result.getClass()); 6 // System.out.println(result); 7 8 // 2,分组: Group By ... Having 9 // hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name"; 10 // hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1"; 11 // hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1"; 12 // --- 13 // hql = "SELECT e.name,COUNT(e.id) " + // 14 // "FROM Employee e " + // 15 // "WHERE id<9 " + // 16 // "GROUP BY e.name " + // 17 // "HAVING count(e.id)>1 " + // 18 // "ORDER BY count(e.id) ASC"; 19 // --- 20 // hql = "SELECT e.name,COUNT(e.id) AS c " + // 21 // "FROM Employee e " + // 22 // "WHERE id<9 " + // 23 // "GROUP BY e.name " + // 24 // "HAVING count(e.id)>1 " + // 在having子句中不能使用列别名 25 // "ORDER BY c ASC"; // 在orderby子句中可以使用列别名 26 27 // 3,连接查询 / HQL是面向对象的查询 28 // >> 内连接(inner关键字可以省略) 29 // hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d"; 30 // hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d"; 31 // >> 左外连接(outer关键字可以省略) 32 // hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d"; 33 // >> 右外连接(outer关键字可以省略) 34 // hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d"; 35 // 可以使用更方便的方法 36 // hql = "SELECT e.id,e.name,e.department.name FROM Employee e"; 37 38 // 4,查询时使用参数 39 // >> 方式一:使用'?'占位 40 // hql = "FROM Employee e WHERE id BETWEEN ? AND ?"; 41 // List list = session.createQuery(hql)// 42 // .setParameter(0, 5)// 设置参数,第1个参数的索引为0。 43 // .setParameter(1, 15)// 44 // .list(); 45 46 // >> 方式二:使用变量名 47 // hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax"; 48 // List list = session.createQuery(hql)// 49 // .setParameter("idMax", 15)// 50 // .setParameter("idMin", 5)// 51 // .list(); 52 53 // 当参数是集合时,一定要使用setParameterList()设置参数值 54 // hql = "FROM Employee e WHERE id IN (:ids)"; 55 // List list = session.createQuery(hql)// 56 // .setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })// 57 // .list(); 58 59 // 5,使用命名查询 60 // Query query = session.getNamedQuery("queryByIdRange"); 61 // query.setParameter("idMin", 3); 62 // query.setParameter("idMax", 10); 63 // List list = query.list(); 64 65 // 6,update与delete,不会通知Session缓存 66 // >> Update 67 // int result = session.createQuery(// 68 // "UPDATE Employee e SET e.name=? WHERE id>15")// 69 // .setParameter(0, "无名氏")// 70 // .executeUpdate(); // 返回int型的结果,表示影响了多少行。 71 // System.out.println("result = " + result); 72 // >> Delete 73 int result = session.createQuery(// 74 "DELETE FROM Employee e WHERE id>15")// 75 .executeUpdate(); // 返回int型的结果,表示影响了多少行。 76 System.out.println("result = " + result); 77 78 // ----- 执行查询并显示结果 79 // // List list = session.createQuery(hql).list(); 80 // for (Object obj : list) { 81 // if (obj.getClass().isArray()) { 82 // System.out.println(Arrays.toString((Object[]) obj)); 83 // } else { 84 // System.out.println(obj); 85 // } 86 // } 87 88 // -------------------------------------------- 89 session.getTransaction().commit(); 90 session.close();