hibernate的三种查询方式,Redis有几种数据类型

本文详细介绍了 Hibernate 中的 HQL 更新操作、分组排序、参数绑定、连接查询、分页查询以及 QBC 查询的实现,包括 Criteria、Projections 和 Restrictions 的使用,展示了如何在 Java 中灵活地进行 ORM 操作。

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 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 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);

//…

//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

数出现,其后将不能再出现占位参数

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

  1. 没有on语句

  2. 能被连接到查询中的必须是主查询对象的子属性

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查询最重要的三个类:

  1. Restrictions 条件限制

  2. Projections 列设射

  3. Order 排序

2.1、查询实现

Criteria criteria = session.createCriteria(Users.class);

//session.createCriteria(“entity.Users”);

//session.createCriteria(Users.class, “别名”);

List 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 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 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 条件限制

语法:https://www.jianshu.com/p/3d3d67663157

Criteria criteria = session.createCriteria(Users.class);

Criterion notNull = Restrictions.isNotNull(“comm”);

criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)

List 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、查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值