hibernate的三种查询方式
hibernate的三种查询方式
hibernate的查询方式常见的主要分为三种: HQL, QBC(命名查询), 以及使用原生SQL查询(SqlQuery);
1、HQL查询
1.1、SQL概述
HQL是
Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;
HQL接近
SQL`语句查询语法。
完整的HQL
语句形式如下:
select
| update
| delete
… from
… where
… group by
… having
… order by
… asc
|desc
其中的update
、delete
为Hibernate3
中所新添加的功能,可见HQL
查询非常类似于标准SQL
查询。HQL
查询在整个Hibernate
实体操作体系中占核心地位。
String hql = "HQL语句";
Query query = session.createQuery(hql);
List list = query.list(); //查询得到多个实体对象集合
Object result = query.uniqueResult(); //查询得到一个实体对象
int x = query.executeUpdate(); //执行update或delete语句,返回数据表受影响行数
1.2、实体查询
查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写
String hql="from Users";//from 实体类类型名称
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、带where的查询
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 单一对象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、属性查询
查询部分属性
String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.4、实体的更新和删除
从hibernate 3版本开始才支持
//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();
//删除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值结果:
正整数:表受影响的行数据
0: 语句正常执行,但没有行受影响
负整数:通常是-1,执行HQL语句是一条查询语句
*/
HQL语句不能做添加
1.5、分组与排序
排序
处理方式和SQL语句中的排序是一样的
String hql="from Users order by uid";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
order by语句只能出现在语句的最后位置
分组
处理方式和SQL语句中分组查询相同
分组语句需要处理筛选,只能使用having语句,而不能使用where语句。
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno"; String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
1.6、参数绑定
使用占位参数
String hql="from Users where uid=? or uname=?";
Query query = session.createQuery(hql);
//索引从0开始
query.setInteger(0, 3);//query.setParameter(0, 3);
query.setString(1, "张三");//query.setParameter(1, "张三");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
使用参数名称
String hql = "from Users where uid=:no1 or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger("no1", 1);
query.setInteger("no2", 3);
//....
可以使用点位参数和名称参数混合使用
String hql = "from User where uid=? or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger(0, 7788);
query.setInteger("no2", 7566);
//....
//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数
1.7、连接查询
--SQL语句:查询员工姓名、薪资、部门名称
SELECT ENAME,SAL,DNAME
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
- 没有on语句
- 能被连接到查询中的必须是主查询对象的子属性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
//HQL连接查询
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义
String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的数组中会保存两个元素:
//0:主数据(Emp)
//1:从数据(Dept)
//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);
Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分页
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
2、QBC查询
QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。
QBC查询最重要的三个类:
- Restrictions 条件限制
- Projections 列设射
- Order 排序
2.1、查询实现
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "别名");
List<Dept> list = criteria.list();
//查询单行结果(如果结果有两行或更多,会报错)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射
语法:
//查询uname属性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();
//查询uname, upwd属性
Criteria criteria = session.createCriteria(Users.class);
//1.创建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.将投射列表设置到准则中
criteria.setProjection(projectionList);
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 条件限制
语法:
Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)
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排序
语法:
Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值类型 | 方法名称 | 描述 |
---|---|---|
Order | Order.asc(String propertyName) | 升序 |
Order | Order.desc(String propertyName) | 降序 |
2.4、分页查询
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标
criteria.setMaxResults(pageSize); //查询的最大行数
List list = criteria.list();
//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用
3、原生SQL查询
1、查询
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回单一对象
System.out.println(user.getUname());
hibernate的三种查询方式的更多相关文章
- Hibernate的Api以及三种查询方式
Hibernate Api |-- Configuration 配置管理类对象 config.configure(); 加载主配置文件的方法(hibernate.cfg.xml) ...
- Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加
Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...
- 初学者易上手的SSH-hibernate02 三种查询方式
在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD.在这之前我们先了解一个东西:主键生成策略.就是当向数据库表中插入记录的时候,这个记录的主键该如何生成 ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- EF提供的三种查询方式
這邊簡單介紹一下,ADO.Net Entity Framework 提供的三種查詢方式, Linq to Entities Query Builder Mothed Entity SQL Langua ...
- django 神奇的双下划线,通过外键的三种查询方式
一,用于跨表操作 只要是object后面字符串都是用双下划线__.其它地方用点. 如:的values中的group_code__name.group_code是一个外键 def list(reques ...
- mybatis学习四 mybatis的三种查询方式
<select id="selAll" resultType="com.caopeng.pojo.Flower"> select * from fl ...
- Spring 集成Hibernate的三种方式
首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...
- Spring IOC以及三种注入方式
IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...
随机推荐
- HQYJ嵌入式学习笔记——C语言复习day2
1.计算机的数值表示 数值类型和非数值类型 二进制 0,1 (0b1001) 八进制 0~7 (0146) 十进制 0~9 十六进制 0~f (0x3f) 八进制转二进制-->一位八进制数换 ...
- js获取数字数组最大值的几种方式
原生Math.max方法 Math.max 方法不能接收数组,可以使用ES6的...将数组打散 const arr = [111, 12, 111, 34, 2, 5, 76]; console.lo ...
- redis.conf 配置说明
redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,R ...
- Flask:Jinjia模板
Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能. 一.变量 1.1 手动传入的变量: 基本类型:{{ var }} 字 ...
- mysql添加远程连接权限
查看登录用户 mysql> select host,user,password from user; 想用本地IP登录,那么可以将以上的Host值改为自己的Ip即可. 这里有多个root,对应着 ...
- 数据结构-PHP 线段树的实现
转: 数据结构-PHP 线段树的实现 1.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...
- tibco EMS 8.2.0安装
安装环境 序号 项目 值 1 OS版本 Red Hat Enterprise Linux Server release 7.1 (Maipo) 2 内核版本 3.10.0-229.el7.x86_64 ...
- pytorch(00)
pytorch入门到项目(-) 一.pytorch的环境 本身项目采用win10系统+pycharm+anaconda+cuda. 其中版本为 python 3.7 anaconda 5.3.1 cu ...
- Go语言学习笔记——在本地建立一个官网查看
命令行内运行 godoc -http=:8080 运行完成后打开浏览器输入网址:http://localhost:8080能看到一个和官网一模一样的网站,然后查看帮助文档
- Docker SDK api操作Docker
下载包 go get "github.com/docker/docker/api/types" go get "github.com/docker/docker/clie ...