HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。
HQL基础查询
1.获取部分列 多列
1 /** 2 * 获取部分列 多列 Object[] 3 */ 4 @Test 5 public void testgetMultipelColumns(){ 6 String hql="select d.dname,d.loc from Dept d"; 7 Query query=session.createQuery(hql); 8 List<Object[]> list=query.list(); 9 for (Object[] item:list){ 10 for (Object items:item) { 11 System.out.println(items+"--"); 12 } 13 System.out.println(); 14 } 15 }
2.获取部分列 多列 list<强类型>
1 /** 2 * 获取部分列 多列 list<强类型> 3 */ 4 @Test 5 public void testgetMultipelColumns(){ 6 String hql="select new Dept(d.deptno,d.dname,d.loc) from Dept d"; 7 Query query=session.createQuery(hql); 8 List<Dept> list=query.list(); 9 for (Dept dept:list){ 10 System.out.println(dept.getDname()); 11 } 12 }
HQL参数查询
使用字符串拼接查询条件存在各种弊端"from User where name = '" + name + "'"
性能低
不安全
使用占位符
按参数位置绑定
from User where name = ?
按参数名称绑定
from User where name = :name
1 /** 2 * 参数查询: 方案三::dname 参数名称绑定+对象属性 3 */ 4 @Test 5 public void selectByConditionParameternameAndObjectAttribute(){ 6 //部门名称为SALES的部门信息 7 String hql="from Dept d where d.dname=:dname and d.loc=:loc"; 8 Query query = session.createQuery(hql); 9 DeptModel model=new DeptModel(); 10 model.setDname("SALES"); 11 model.setLoc("CHICAGO"); 12 query.setProperties(model); 13 List<Dept> list = query.list(); 14 for (Dept dept:list) { 15 System.out.println(dept.getDname()); 16 } 17 } 18 /** 19 * 参数查询: 方案二::dname 参数名称绑定 20 */ 21 @Test 22 public void selectByConditionParametername(){ 23 //部门名称为SALES的部门信息 24 String hql="from Dept d where d.dname=:dname and d.loc=:loc"; 25 Query query = session.createQuery(hql); 26 query.setParameter("dname","SALES"); 27 query.setParameter("loc","CHICAGO"); 28 List<Dept> list = query.list(); 29 for (Dept dept:list) { 30 System.out.println(dept.getDname()); 31 } 32 } 33 /** 34 * 参数查询: 方案一:? 匿名占位符 35 */ 36 @Test 37 public void selectByConditionNiming(){ 38 //部门名称为SALES的部门信息 39 String hql="from Dept d where d.dname=? and d.loc=?"; 40 Query query = session.createQuery(hql); 41 query.setParameter(0,"SALES"); 42 query.setParameter(1,"CHICAGO"); 43 List<Dept> list = query.list(); 44 for (Dept dept:list 45 ) { 46 System.out.println(dept.getDname()); 47 } 48 }
动态查询
1 /** 2 * 动态sql 3 */ 4 @Test 5 public void selectByDynamic() throws ParseException { 6 EmpCondition emp=new EmpCondition(); 7 emp.setJob("CLERK"); 8 emp.setSal(1000.0); 9 //入职时间 10 emp.setFromDate(Tool.strDate("1891-05-01")); 11 //离职时间 12 emp.setEndDate(new Date()); 13 //根据条件拼接sql 14 StringBuilder sb=new StringBuilder("from Emp e where 1=1 "); 15 if(emp.getJob()!=null){ 16 sb.append("and e.job =:job "); 17 } 18 if(emp.getSal()!=null){ 19 sb.append("and e.sal >:sal "); 20 } 21 if (emp.getFromDate()!=null){ 22 sb.append("and e.hiredate >=:fromDate "); 23 } 24 if (emp.getEndDate()!=null){ 25 sb.append("and e.hiredate <=:endDate "); 26 } 27 Query query=session.createQuery(sb.toString()); 28 query.setProperties(emp); 29 List<Emp> list = query.list(); 30 for (Emp item:list) { 31 System.out.println(item.getEname()); 32 } 33 }
分页查询
Query接口的相关方法
uniqueResult() :获取唯一对象
setFirstResult() :设置从第几条开始
setMaxResults():设置读取最大记录数
1 /** 2 * 分页 3 */ 4 @Test 5 public void selectPage(){ 6 String hql="from Emp order by empno"; 7 Query query = session.createQuery(hql); 8 int pageIndex=1; 9 int pageSize=3; 10 query.setFirstResult((pageIndex-1)*pageSize); 11 query.setMaxResults(pageSize); 12 List<Emp> empList=query.list(); 13 for (Emp emp:empList){ 14 System.out.println(emp.getEname()); 15 } 16 }
提取工具类:HibernateUtil.java
1 //线程变量 2 static ThreadLocal<Session> tlSession=new ThreadLocal<Session>(); 3 public static SessionFactory factory; 4 static Configuration cfg=null; 5 static { 6 cfg=new Configuration().configure("hibernate.cfgscott.xml"); 7 factory=cfg.buildSessionFactory(); 8 } 9 //1.获取连接 10 public static Session getSession(){ 11 //01 从线程中尝试获取 12 Session session=tlSession.get(); 13 if (session==null){ 14 session=factory.openSession(); 15 tlSession.set(session); 16 } 17 return session; 18 } 19 //2.释放连接 20 public static void closeSession(){ 21 Session session=tlSession.get(); 22 if (session!=null){ 23 tlSession.set(null); 24 session.close(); 25 } 26 }