Hibernate之HQL总结

框架下载地址
百度云盘

Hibernate简介

Hibernate是一个开放源代码的对象关系映射框架(ORM),它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate架构包括许多对象持久对象,会话工厂,事务工厂,连接工厂,会话,事务等

这里写图片描述
更多信息

HQL语言

HQL(Hibernate Query Language)是完全面向对象的查询语言。它提供了更加面向对象的封装,因此它支持继承、多态等特征。
HQL基本语法如下:
注意这里查询的都是JAVA类对象
select "对象.属性名"
from "对象名"
where "条件"
group by "对象.属性名" having "分组条件"
order by "对象.属性名"
  1. 实体对象查询

    • 查询所有信息

      Employee是一个实体类
      select * from Employee 
      等价于
      from Employee
    • 查询指定列名(投影查询)

      注意:Employee对象必须要有构造方法public Employee(String empname, String job)
      select new Employee (empname,job) from Employee

  2. 条件查询

    • 简单条件查询

      from Employee emp where emp.sex="男"
    • 分页查询
      Employee ee = new Employee();
          // ee.setEmpname("杨%");
           ee.setSalary(6000.0);
          // ee.setJob("神雕大侠");
      
          Session session = HibernateSessionFactory.getSession();
      
          StringBuffer buffer = new StringBuffer("from Employee where 1=1");
          //拼接HQL
          if (ee.getEmpname() != null && ee.getEmpname().length() > 0) {
              buffer.append(" and empname like :empname");
          }
      
          if (ee.getSalary() != null && ee.getSalary() > 0) {
              buffer.append(" and salary> :salary");
          }
      
          if (ee.getJob() != null && ee.getJob().length() > 0) {
              buffer.append(" and job= :job");
          }
          Query query=session.createQuery(buffer.toString());
          query.setProperties(ee);
          //设置分页
          query.setFirstResult(0);
          query.setMaxResults(5);
          List<Emp> list=query.list();
          for (Emp e : list) {
              System.out.println(e.getEmpid() + "," + e.getEmpname() + ","
                      + e.getGender() + "," + e.getJob() + "," + e.getSalary());
          }
          HibernateSessionFactory.closeSession();
  3. 参数绑定机制

    • 占位符 替代具体参数

      Session session=HibernateSessionFactory.getSession();
      String hql="from Emp where empname like ? and salary>? and job=?";
      
      Query query=session.createQuery(hql);
      //按顺序赋值
      query.setString(0, "杨过");
      query.setDouble(1, 5000);
      query.setString(2, "神雕大侠");
      List<Emp> list=query.list();
      //处理集合,关闭session
      HibernateSessionFactory.closeSession();
    • 引用占位符 :param 替代具体参数

      ...
      Session session=HibernateSessionFactory.getSession();       
      String hql="from Emp where empname like :empname and salary>:salary and job=:job";
      Query query=session.createQuery(hql);
      //按名称赋值
      query.setString("empname", "杨过");
      query.setDouble("salary", 5000);
      query.setString("job", "神雕大侠");
      //不知道参数类型的情况下
      query.setParameter("sex","男");
      List<Emp> list=query.list();
      //处理集合,关闭session
      HibernateSessionFactory.closeSession();
    • 对象查询

      ...
      Session session=HibernateSessionFactory.getSession();       
      String hql="from Emp where empname like :empname and salary>:salary and job=:job";
      Query query=session.createQuery(hql);
      Emp ee=new Emp();
      ee.setEmpname("杨%");
      ee.setSalary(5000.0);
      ee.setJob("神雕大侠");
      //这里是将信息存入了emp对象
      //将emp对象放入作为查询参数
      //这里也支持Map格式的对象
      query.setProperties(ee);
      List<Emp> list=query.list();
      //处理集合,关闭session
      HibernateSessionFactory.closeSession();
  4. 排序查询
    在SQL中通过order by 子句和 ascdesc 实现排序操作。HQL也提供了这样的功能,用法和SQL类似,只是操作的不再是数据表的列名,而是实体对象的属性。

    //按员工年龄降序排序,多个条件用逗号**,** 分隔
    from Employee emp order by emp.age desc,emp.sex asc
  5. 聚合函数
    HQL同样也支持聚合函数,如 sum、avg、count、max、min 等。

    例1:查询员工的平均年龄
        select avg(emp.age) from Employee emp
    例2:统计员工个数(统计任意列都可以)
        select count(emp.age) from Employee emp
    
  6. 子查询
    HQL中子查询必须被圆括号()包起来

     查询年龄大于平均年龄的员工
    from Employee emp where emp.age>(select avg(age) from Employee)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值