Hibernate高级查询

来源:互联网 发布:cc3d飞控调参软件 编辑:程序博客网 时间:2024/05/17 00:08

实体查询

示例:from cn.jbit.hibernatdemo.entity.Deptselect dept from Dept as deptfrom Dept where deptName = 'SALES'from Dept dept where dept.location is not nullfrom Emp order by hireDate,salary desc
  • 条件
    这里写图片描述

投影查询

  • 指定属性查询
    这里写图片描述

  • 通过构造方法
    这里写图片描述
    这里写图片描述

实体查询的更新和删除

示例://更新String hql = "update Emp set ename = 'XX' where empno = 'XX'";//删除String hql = "delete from Emp where empno = 'XX'";//创建Query接口实例,预编译hql语句Query query = session.createQuery(hql);//执行hql语句,返回影响条数int count = query.executeUpdate();

参数绑定

  • 使用?占位符
示例:String hql = "from Emp where ename =?";Query query = session.createQuery(hql);query.setString(0, "张三");//参数下标从0开始
  • 使用命名参数
String hql = "from Emp where ename =:param";Query query = session.createQuery(hql);query.setString("param", "张三");//query.setParameter("param", "张三");//推荐使用这一种,不依赖参数出现顺序,使用灵活

排序、统计函数、分组

  • 排序
hql语句示例:1.通过order by子句实现对查询结果排序,默认升序String hql = "from Emp order by empno";2.指定排序方式:asc(升序)、desc(降序)String hql = "from Emp order by empno desc";3.多个排序条件String hql = "from Emp order by empno,ename desc";
  • 统计函数
    1).avg() 平均数
    2).sum()求和
    3).min()最小值
    4).max()最大值
    5).count()统计次数
示例:String hql = "select count(*) from Emp";long count = (Long)session.createQuery(hql).uniqueResult();//uniqueResult()获取唯一对象,返回值是Long类型
  • 分组
示例://统计人数大于20的班级的学生人数String hql = "select gid,count(*) from Student              group by gid              having count(*)>20";

分页

  • Hibernate Query接口提供的方法
    1).setFirstResult()设置第一条记录的位置
    2).setMaxResults()设置最大返回的记录条数
    //每页显示2条数据,显示第二页数据    public static void query() {        Session session = HibernateSessionFactory.getSession();        session.beginTransaction();        String hql = "from Student";        Query query = session.createQuery(hql);        //从第几条开始,HQL是从0开始 SQL是从1开始        query.setFirstResult(0);        //显示条数        query.setMaxResults(2);        List<Student> list = query.list();        for(Student s : list) {            System.out.println(s.getSname());        }    }

子查询、连接查询

  • 子查询
//查询成绩高于A和B的学生信息String hql = "from Student where score > all              (select score from Student where               sname = 'A' or sname = 'B')";
  • 连接查询
    这里写图片描述

  • 示例
    1).使用迫切左外连接查询所有学习Java的学生信息
    这里写图片描述

2).使用左外连接查询所有学习Java的学生信息
这里写图片描述

  • 为什么没有右外迫切连接?
    随手画了一张图解释
    这里写图片描述

批处理

  • hibernate.cfg.xml添加批处理配置
//批处理数一般设置为10~50<property name="hibernate.jdbc.batch_size">20</property>//关闭二级缓存<property name="hibernate.cache.use_second_level_cache">false</property>
  • 示例
    /**     * 批量插入数据     */    public void method1() {        Session session = HibernateSessionFactory.getSession();        Transaction transaction = session.beginTransaction();        Dept dept = null;        for(int i = 1; i < 1000; i++) {            dept = new Dept();            dept.setDname(i + "");            dept.setLoc(i + "i");            session.save(dept);            //批量操作数设置为与配置文件一致            if(i % 20 == 0) {                session.flush();                session.clear();            }        }        transaction.commit();        HibernateSessionFactory.closeSession();    }    /**     * 批量更新数据     */    public void method2() {        Session session = HibernateSessionFactory.getSession();        Transaction transaction = session.beginTransaction();        String hql = "from Dept";        //游标,设置batch_size属性为20且关闭二级缓存        ScrollableResults results = session.createQuery(hql).scroll(ScrollMode.FORWARD_ONLY);        while (results.next()) {            Dept dept = (Dept) results.get(0);            dept.setDname("Java");        }        transaction.commit();        HibernateSessionFactory.closeSession();    }
0 0