• 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     }
  • 相关阅读:
    C++003类的析构函数
    C++002类的构造函数
    C++001类
    simulink与控制系统仿真01自动控制原理简介
    telnet
    WEB
    Python_包
    Python_装饰器
    Pycharm+Tensorflow安装和使用出现的问题集合
    HTML+CSS综合使用
  • 原文地址:https://www.cnblogs.com/liutao1122/p/8119255.html
Copyright © 2020-2023  润新知