HQL实用技术

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     }
原文地址:https://www.cnblogs.com/liutao1122/p/8119255.html