hibernate的三种查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC(命名查询), 以及使用原生SQL查询(SqlQuery);

1、HQL查询

1.1、SQL概述

HQLHibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。

完整的HQL语句形式如下:

select | update | deletefromwheregroup byhavingorder byasc|desc

其中的updatedeleteHibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体操作体系中占核心地位。

  1. String hql = "HQL语句";
  2. Query query = session.createQuery(hql);
  3. List list = query.list(); //查询得到多个实体对象集合
  4. Object result = query.uniqueResult(); //查询得到一个实体对象
  5. int x = query.executeUpdate(); //执行update或delete语句,返回数据表受影响行数

1.2、实体查询

查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写

  1. String hql="from Users";//from 实体类类型名称
  2. Query query = session.createQuery(hql);
  3. List<Users> list = query.list();
  4. for (Users user : list) {
  5. System.out.println(user);
  6. }

1.3、带where的查询

  1. Query query = session.createQuery("from Users where uid=3");
  2. Users user = (Users) query.uniqueResult();//uniqueResult 单一对象
  3. System.out.println(user);
  1. Query query = session.createQuery("from Users where uid>5");
  2. List<Users> list = query.list();
  3. for (Users user : list) {
  4. System.out.println(user);
  5. }

1.3、属性查询

查询部分属性

  1. String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";
  2. Query query = session.createQuery(hql);
  3. List<Object[]> list = query.list();
  4. for (Object[] objects : list) {
  5. System.out.println(Arrays.toString(objects));
  6. }
  1. String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";
  2. Query query = session.createQuery(hql);
  3. List<Users> list = query.list();
  4. for (Users user : list) {
  5. System.out.println(user);
  6. }

1.4、实体的更新和删除

从hibernate 3版本开始才支持

  1. //更新
  2. String hql="update Users set uname='王五',upwd='321' where uid=3";
  3. int res = session.createQuery(hql).executeUpdate();
  4. //删除
  5. String hql="delete from Users where uid=3";
  6. int res = session.createQuery(hql).executeUpdate();
  7. /*
  8. 返回值结果:
  9. 正整数:表受影响的行数据
  10. 0: 语句正常执行,但没有行受影响
  11. 负整数:通常是-1,执行HQL语句是一条查询语句
  12. */

HQL语句不能做添加

1.5、分组与排序

  • 排序

    处理方式和SQL语句中的排序是一样的

    1. String hql="from Users order by uid";
    2. Query query = session.createQuery(hql);
    3. List<Users> list = query.list();
    4. for (Users user : list) {
    5. System.out.println(user);
    6. }

    order by语句只能出现在语句的最后位置

  • 分组

    处理方式和SQL语句中分组查询相同

    分组语句需要处理筛选,只能使用having语句,而不能使用where语句。

    1. String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
    2. String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";

1.6、参数绑定

  • 使用占位参数

    1. String hql="from Users where uid=? or uname=?";
    2. Query query = session.createQuery(hql);
    3. //索引从0开始
    4. query.setInteger(0, 3);//query.setParameter(0, 3);
    5. query.setString(1, "张三");//query.setParameter(1, "张三");
    6. List<Users> list = query.list();
    7. for (Users user : list) {
    8. System.out.println(user);
    9. }
  • 使用参数名称

    1. String hql = "from Users where uid=:no1 or uid=:no2";
    2. Query query = session.createQuery(hql);
    3. query.setInteger("no1", 1);
    4. query.setInteger("no2", 3);
    5. //....
  • 可以使用点位参数和名称参数混合使用

    1. String hql = "from User where uid=? or uid=:no2";
    2. Query query = session.createQuery(hql);
    3. query.setInteger(0, 7788);
    4. query.setInteger("no2", 7566);
    5. //....
    6. //使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数

1.7、连接查询

  1. --SQL语句:查询员工姓名、薪资、部门名称
  2. SELECT ENAME,SAL,DNAME
  3. FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
  4. SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
  1. 没有on语句
  2. 能被连接到查询中的必须是主查询对象的子属性
  1. String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
  2. //HQL连接查询
  3. String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
  4. String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义
  5. String hql = "FROM Emp e JOIN e.dept";
  6. Query query = session.createQuery(hql);
  7. List<Object[]> list = query.list();
  8. //List集合中的数组中会保存两个元素:
  9. //0:主数据(Emp)
  10. //1:从数据(Dept)
  11. //查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中
  12. String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
  13. Query query = session.createQuery(hql);
  14. Emp emp = (Emp) query.uniqueResult();
  15. System.out.println(emp);
  16. System.out.println(emp.getManager());
  17. System.out.println(emp.getDept());

1.8、分页

  1. String hql = "from Users";
  2. Query query = session.createQuery(hql);
  3. query.setFirstResult(0);
  4. query.setMaxResults(2);

2、QBC查询

QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

QBC查询最重要的三个类:

  1. Restrictions 条件限制
  2. Projections 列设射
  3. Order 排序

2.1、查询实现

  1. Criteria criteria = session.createCriteria(Users.class);
  2. //session.createCriteria("entity.Users");
  3. //session.createCriteria(Users.class, "别名");
  4. List<Dept> list = criteria.list();
  5. //查询单行结果(如果结果有两行或更多,会报错)
  6. Object uniqueResult = criteria.uniqueResult();

2.2、Projections 列投射

语法:

  1. //查询uname属性
  2. Criteria criteria = session.createCriteria(Users.class);
  3. PropertyProjection property = Projections.property("name");
  4. criteria.setProjection(property);
  5. List<Object> result = criteria.list();
  6. //查询uname, upwd属性
  7. Criteria criteria = session.createCriteria(Users.class);
  8. //1.创建投射列表
  9. ProjectionList projectionList = Projections.projectionList();
  10. //2.向投射列表中添加列投射
  11. PropertyProjection property1 = Projections.property("uname");
  12. PropertyProjection property2 = Projections.property("upwd");
  13. projectionList.add(property1).add(property2);
  14. //3.将投射列表设置到准则中
  15. criteria.setProjection(projectionList);
  16. List<Object> result = criteria.list();
返回值类型 方法名称 描述
PropertyProjection Projections.property 指定某属性
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 统计某属性的数量
CountProjection Projections.countDistinct 统计某属性不同值的数量
PropertyProjection Projections.groupProperty 指定某个属性为分组属性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 创建一个ProjectionList对象
Projection Projections.rowCount 查询结果集中的记录条数
AggregateProjection Projections.sum 求某属性的合计

2.3、Restrictions 条件限制

语法:

  1. Criteria criteria = session.createCriteria(Users.class);
  2. Criterion notNull = Restrictions.isNotNull("comm");
  3. criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)
  4. List<Users> list = criteria.list();
返回值类型 方法名称 描述
SimpleExpression Restrictions.eq 等于(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
SimpleExpression Restrictions.gt 大于(great than)
SimpleExpression Restrictions.ge 大于等于(great than or equal)
SimpleExpression Restrictions.lt 小于(less than)
SimpleExpression Restrictions.le 小于等于(less than or equal)
Criterion Restrictions.between 对应SQL的between
SimpleExpression Restrictions.like 对应SQL的like
Criterion Restrictions.in 对应SQL的in
LogicalExpression Restrictions.and and关系
LogicalExpression Restrictions.or or关系
Criterion Restrictions.isNull 为空
Criterion Restrictions.sqlRestriction SQL限定查询
Criterion Restrictions.not 取反

2.3、Order排序

语法:

  1. Criteria criteria = session.createCriteria(Dept.class);
  2. criteria.addOrder(Order.asc("name"))
  3. .addOrder(Order.desc("loc"));
  4. //SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值类型 方法名称 描述
Order Order.asc(String propertyName) 升序
Order Order.desc(String propertyName) 降序

2.4、分页查询

  1. Criteria criteria = session.createCriteria(Dept.class);
  2. int pageNum = 2, pageSize = 5;
  3. criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标
  4. criteria.setMaxResults(pageSize); //查询的最大行数
  5. List list = criteria.list();
  6. //setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用

3、原生SQL查询

1、查询

  1. String sql = "select uid,uname,upwd from _users";
  2. List list = session.createSQLQuery(sql).list();
  3. for(Object obj : list){
  4. System.out.println(obj);
  5. }

2、 addEntity()

  1. String sql = "select uid,uname,upwd from _users";
  2. // addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
  3. SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
  4. List<User> list = query.list();
  5. for(Users user : list){
  6. System.out.println(user.getUname());
  7. }

3、 uniqueResult

  1. String sql = "select uid,uname,upwd from _users where uid = 2";
  2. SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
  3. Users user = (Users) query.uniqueResult();//返回单一对象
  4. System.out.println(user.getUname());

hibernate的三种查询方式的更多相关文章

  1. Hibernate的Api以及三种查询方式

    Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) ...

  2. Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...

  3. 初学者易上手的SSH-hibernate02 三种查询方式

    在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD.在这之前我们先了解一个东西:主键生成策略.就是当向数据库表中插入记录的时候,这个记录的主键该如何生成 ...

  4. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  5. EF提供的三种查询方式

    這邊簡單介紹一下,ADO.Net Entity Framework 提供的三種查詢方式, Linq to Entities Query Builder Mothed Entity SQL Langua ...

  6. django 神奇的双下划线,通过外键的三种查询方式

    一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...

  7. mybatis学习四 mybatis的三种查询方式

    <select id="selAll" resultType="com.caopeng.pojo.Flower"> select * from fl ...

  8. Spring 集成Hibernate的三种方式

    首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...

  9. Spring IOC以及三种注入方式

    IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...

随机推荐

  1. STM32之SPI通信

    SPI总线简介 >SPI总线介绍 SPI接口是Motorola首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构:支持多slave模式应用,一般仅支持单Maste ...

  2. 关于GitHub 搭建 Hexo 总结

    问题描述 在更新上传了一篇新博客后,本地运行http://localhost:4001正常,而连接到Github仓库便爆出404错误. 更新博客后,依次执行: 1 hexo clean 2 hexo ...

  3. 基于QT的全自动超声波焊接机上位机追溯系统(已经在设备上应用)

    应用说明: 本上位机程序是我在做锂电池产线项目的时候开发的,用于采集设备数据以及实现设备自动控制,下位机采用基恩士PLC,超声波机采用上海一家的超声波焊接机,实现电芯极耳的自动焊接,上位在设备焊接过程 ...

  4. 实现 Abp Vnext Pro

    Abp Vnext Pro 的 Vue 实现版本 开箱即用的中后台前端/设计解决方案 知识点 .Net Core5.0 Abp Vnext 4.x , Ant Design, Vue2.x Mysql ...

  5. linux 关闭对端口的监听

    netstat -anp | grep [端口号] [root@test-01 ~]# netstat -anp | grep 6665 tcp 0 0 0.0.0.0:6665 0.0.0.0:* ...

  6. 40. 组合总和 II + 递归 + 回溯 + 记录路径

    40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...

  7. AOP(面向切面编程)大概了解一下

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...

  8. Java 树结构的基础部分(一)

    二叉树 1.1 为什么需要树这种数据结构 1) 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序 ...

  9. super_curd组件技术点总结

    1.基于包的导入的方式实现单例模式 # test1.py class AdminSite(object): def __init__(self): self.registry = {} self.ap ...

  10. python matrix转list

    a = [[1,2],[3,4]] a = np.mat(a) print(a.getA().tolist())