hibernate的三种查询方式

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

//…

//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数

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

String sql = “select uid,uname,upwd from _users”;

List list = session.createSQLQuery(sql).list();

for(Object obj : list){

System.out.println(obj);

}

2、 addEntity()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

[外链图片转存中…(img-V7exmrLp-1711617676787)]

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

[外链图片转存中…(img-09eSjLcz-1711617676788)]

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-x5nzQg5g-1711617676788)]

[外链图片转存中…(img-e5A0egxh-1711617676788)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值