hibernate的三种查询方式
2021-04-21 19:45
113 查看
hibernate的三种查询方式
目录- hibernate的三种查询方式1、HQL查询1.1、SQL概述
- 1.2、实体查询
- 1.3、带where的查询
- 1.3、属性查询
- 1.4、实体的更新和删除
- 1.5、分组与排序
- 1.6、参数绑定
- 1.7、连接查询
- 1.8、分页
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); } ad8
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.crea ad0 teQuery(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 28d8 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的三种查询方式
- hibernate 三种查询方式源码跟踪及总结
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Hibernate查询数据库的三种方式
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种
- Hibernate的三种查询方式
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Hibernate学习-07:CRUD(增删改查)操作之查询多条/所有记录HQL、QBC、SQL三种方式
- Hibernate的三种查询方式
- Hibernate的三种查询方式
- Hibernate的Api以及三种查询方式
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- hibernate三种查询方式
- Hibernate模糊查询三种方式
- hibernate 有三种查询方式
- hibernate 三种常用的查询方式
- hibernate三种查询方式
- hibernate的三种查询方式