Hibernate高级查询

实体查询

示例:
from cn.jbit.hibernatdemo.entity.Dept

select dept from Dept as dept

from Dept where deptName = 'SALES'

from Dept dept where dept.location is not null

from 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();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值