hibernate HQL查询

实体类规范(javaBean规范)
1.提供无参构造方法
2.成员变量私有化 提供get/set方法
3.基本数据类型尽量使用包装类型(可以多表示一个值null 例如考试分数 缺考和0分)
4.实体中必须要提供一个与表中的主键对应的属性id
hibernate是通过主键来区别对象是否相同
5.不要使用final修饰实体类(代理对象是要继承该类的)

主键类型
1.自然主键
表中有复合主键规范的的字段(唯一并且不重复) 此时可以用来做主键
2.代理主键(常用)
找不到主键(没有字段符合主键规则)
创建一个没有任何意义的主键id列 作为主键 就是为了非空不重复 叫做代理主键

主键生成策略(7种)
1 identity: 主键自增 由数据库维护 插入数据 无id

2.increment: 主键自增 由hibernate维护
会先查询最大的id 然后在这个最大的基础上+1 并且插入数据时有id

3.sequence: 序列

4.hilo: 高低位算法 (hibernate会自己通过该算法 算出主键自增)

5.native(常用): hilo + identity + sequence 三选一
系统会检测你的数据库类型 mysql 就是自增策略

6.uuid: 全球范围内 不重复的值 是字符串
注意: 主键必须是字符串类型
是由hibernate生成的id 然后插入到数据库中

7.assigned: 是由程序员自己管理主键

三种状态
1.瞬时态 没有id 和没有session关联
2.持久态 有id 和session有关联
3.游离态 有id 和session没有关联

目的: 将我们想要同步到数据库的数据 所对应的对象转换成持久态
这里写图片描述

一级缓存
这里写图片描述

快照
这里写图片描述

HQL 查询(简单多表查询 不复杂的查询)

1.查询所有对象
String HQL = "from User"; 其中User是类名 不是表名
String HQL = "from User where id = 1"; 其中id代表属性名 不是表中的字段名
查询方法: session.createQuery(字符串名);
返回结果(预见结果)
如果返回的是集合 就使用list()
如果返回的是单个 就使用uniqueResult()

@Test
    public void fun1() {
        String sql = "from com.lanou3g.User";
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Query query = session.createQuery(sql);
        // 预见结果(单数据)
//      User user = (User) query.uniqueResult();
//      System.out.println(user);
        // 预见结果(多数据)
        List list = query.list();
        System.out.println(list);
        transaction.commit();
        session.close();
    }

2.问号(?)占位符查询
赋值参数的时候 参数1 占位符的索引 参数2 查询条件
注意:HQL索引从0开始的
query.setParameter(0, 2);

@Test
    public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        String sql = "from com.lanou3g.User where id = ?";
        Query query = session.createQuery(sql);
        // 给语句中的问号赋值 从0开始
        query.setParameter(0, 2);
        User user = (User) query.uniqueResult();
        System.out.println(user);
        transaction.commit();
        session.close();
    }

3.冒号(:)占位符查询
冒号(:) 后面相当于给这个冒号占位符 起了个别名
注意: 冒号后面不要加空格

@Test
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        // 冒号(:) 后面相当于给这个冒号占位符 起了个别名
        // 注意: 冒号后面不要加空格
        String sql = "from com.lanou3g.User where id = :ww";
        Query query = session.createQuery(sql);
        query.setParameter("ww", 1);
        User user = (User) query.uniqueResult();
        System.out.println(user);
        transaction.commit();
        session.close();
    }

4.分页查询
设置起始setFirstResult();
最大显示setMaxResults();

@Test
    public void fun4() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        String hql = "from com.lanou3g.User";
        Query query = session.createQuery(hql);
        // 设置起始 和 最大位置
        query.setFirstResult(0);
        query.setMaxResults(2);
        // 接收
        List list = query.list();
        System.out.println(list);
        transaction.commit();
        session.close();
    }

5.无语句查询
Restrictions.eq() 等于
Restrictions.gt() 大于
Restrictions.ge() 大于等于
Restrictions.lt() 小于
Restrictions.le() 小于等于
Restrictions.isnull() 等于空值
Restrictions.isNotNull() 非空值
Restrictions.like() 字符串模式匹配
Restrictions.and() 逻辑与
Restrictions.or() 逻辑或
Restrictions.not() 逻辑非
Restrictions.in() 等于列表中的某一个值
Restrictions.between() 闭区间中的任意值

@Test
    public void fun5() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Criteria criteria = session.createCriteria(User.class);
        List list = criteria.list();
        System.out.println(list);
        transaction.commit();
        session.close();
    }

6.查询一共有多少记录数
一般返回值是个数的 通常使用Long来接收

@Test
    public void fun7() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Criteria criteria = session.createCriteria(User.class);
        criteria.setProjection(Projections.rowCount());
        Long l = (Long) criteria.uniqueResult();
        System.out.println(l);
        transaction.commit();
        session.close();
    }

7.原生sql查询(复杂的多表查询)
注意:返回的结果跟对象没有关系

@Test
    public void fun8() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        String sql = "select * from user where id=?";
        Query query = session.createSQLQuery(sql);
        query.setParameter(0, 3);
//      List<Object[]> list = query.list();
//      for (Object[] object : list) {
//          System.out.println(Arrays.toString(object));
//      }

        // 一条记录就是一个Object数组
        Object[] objects = (Object[]) query.uniqueResult();
        for (Object object : objects) {
            System.out.println(object);
        }
        transaction.commit();
        session.close();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值