ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

eclipse学习(第三章:ssh中的Hibernate)——9.Hibernate里面的标准查询

2021-06-12 14:03:02  阅读:279  来源: 互联网

标签:session studentId 已弃 eclipse 查询 Hibernate ssh criteria Criteria


eclipse学习(第三章:ssh中的Hibernate)——9.Hibernate里面的标准查询

前言(建议看一下有版本差距)

本文参考自https://www.w3cschool.cn/hibernate/ugov1ie8.html后做的一个实践日志记录。
旧版本的话,你直接这么使用是没有任何问题的。
我这里举个最简单的例子吧,直接创建即可,如果就可以往里面添加参数处理了。

Criteria c = session.createCriteria(Address.class);
List<Address> l = c.list();

但是如果你换了版本,这个hibernate版本是在Hibernate5.2之后就会出现了已弃用的标志,要改为如下情况。

	//创建CriteriaBuilder对象
	CriteriaBuilder bulider = session.getCriteriaBuilder();
	//创建对应实体类的CriteriaQuery对象
	CriteriaQuery<Address> criteriaQuery = bulider.createQuery(Address.class);
	//通过CriteriaQuery对象设置条件,这里是设置根条件
	Root<Address> addressRoot = criteriaQuery.from(Address.class);
	//通过session创建查询语句
	Query q = session.createQuery(criteriaQuery);
	//获取查询结果
	List<Address> a = q.getResultList();

如果你使用已弃用的方法的话,会有这个输出

WARN: HHH90000022: Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead

我要说一句,这个标准查询是用来做查询处理的

标准查询

其实就是将一般的查询条件抽取成方法,替换了写hql的过程,其实都很类似的。不过我觉得写个hql其实比写这个好,起码省略了几行代码…

标准查询的部分示例说明

1、单条件查询(这里是使用新方法的)

新方法的话目前我就只能弄到这里了,抱歉,实力不够,弄不上去,其实还能弄一些更多示例的,不过看网址也行了https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#criteria-typedquery-entity

List<Address> addressList = null;
		try {
			transaction = session.beginTransaction();
			
			//通过session获取CriteriaBuilder	
			CriteriaBuilder builder = session.getCriteriaBuilder();
			//通过bulider创建查询语句
			CriteriaQuery<Address> crQuery = builder.createQuery(Address.class);
			//创建查询语句的根条件
			Root<Address> addressRoot = crQuery.from(Address.class);	
			//查询语句中的设置查询主体
			crQuery.select(addressRoot);
			
			//以下是根据不同情况下做的一些处理
			//查询studentId大于6的,gt是大于
//			crQuery.where(builder.gt(addressRoot.get("studentId"), 6));
			
			//查询studentId小于7的,lt是小于
//			crQuery.where(builder.lt(addressRoot.get("studentId"), 7));
			
			//查询studentId等于6的,equal是等于
//			crQuery.where(builder.equal(addressRoot.get("studentId"), 6));
			
			//模糊查询addressDetail以A省开头的列,like是模糊查询,一般与%和_一起使用
//			crQuery.where(builder.like(addressRoot.get("addressDetail"), "A省%"));
			
			//模糊查询addressDetail不为A省开头的列,like是模糊查询,一般与%和_一起使用
//			crQuery.where(builder.notLike(addressRoot.get("addressDetail"),"A省%"));
			
			//查询studentId在6-7之间的列,获取到的区间为:6<=x<=7
//			crQuery.where(builder.between(addressRoot.get("studentId"), 6, 7));
			
			//查询addressDetail不为空的列
//			crQuery.where(builder.isNotNull(addressRoot.get("addressDetail")));
			
			//查询addressDetail为空的列
			crQuery.where(builder.isNull(addressRoot.get("studentId")));
			
			//使用session执行自定义的查询语句
			Query q = session.createQuery(crQuery);
			//获取查询结果
			addressList = q.getResultList();
		
			transaction.commit();

2、单条件查询(使用已弃用方法)

旧方法处理,这里是做单条件处理,当然你写两条就代表and了,也可以充当多条件and处理,但是多条件建议还是使用下一个

List<Address> addressList = null;
		try {
			transaction = session.beginTransaction();
			//创建Criteria,根据对应的实体类创建
			Criteria criteria = session.createCriteria(Address.class);
			
			//查询学生id大于7的列
//			criteria.add(Restrictions.gt("studentId", 7));
			
			//查询学生id大于等于7的列
//			criteria.add(Restrictions.ge("studentId", 7));
			
			//查询学生id小于7的列
//			criteria.add(Restrictions.lt("studentId", 7));
			
			//查询学生id等于7的列
//			criteria.add(Restrictions.eq("studentId", 7));
			
			//模糊查询addressDetail以A省开头的数据
//			criteria.add(Restrictions.like("addressDetail", "A省%"));
			
			//模糊查询addressDetail不以A省开头的数据
//			criteria.add(Restrictions.ilike("addressDetail", "A省%"));
			
			//查询学生id在6-7之间的内容,6<=x<=7
//			criteria.add(Restrictions.between("studentId", 6, 7));
			
			//查询学生id是否为空
			criteria.add(Restrictions.isNull("studentId"));
			
			//查询addressDetail是否为空
//			criteria.add(Restrictions.isNull("addressDetail"));
				
			addressList = criteria.list();
			transaction.commit();

3、多条件查询(使用已弃用方法)

旧方法处理,这里是做多条件处理

List<Address> addressList = null;
		try {
			transaction = session.beginTransaction();
			//创建Criteria,根据对应的实体类创建
			Criteria criteria = session.createCriteria(Address.class);
			
			//增加条件,一个是studentId=7一个是studentId=8
			Criterion c1 = Restrictions.eq("studentId", 7);
			Criterion c2 = Restrictions.eq("studentId", 8);	
			
			//这里使用or将上面条件组合起来
			LogicalExpression or = Restrictions.or(c1,c2);
			criteria.add(or);
			
			//这里使用and将上面条件组合起来
//			LogicalExpression and = Restrictions.and(c1,c2);
//			criteria.add(and);
			
			addressList = criteria.list();
			transaction.commit();

4、分页处理(使用已弃用方法)

分页处理

List<Address> addressList = null;
		try {
			transaction = session.beginTransaction();
			//创建Criteria,根据对应的实体类创建
			Criteria criteria = session.createCriteria(Address.class);
			
			//设置起始数据位置
			criteria.setFirstResult(0);
			//设置显示的数据量
			criteria.setMaxResults(1);
			
			addressList = criteria.list();
			transaction.commit();

5、排序处理(使用已弃用方法)

排序处理

List<Address> addressList = null;
		try {
			transaction = session.beginTransaction();
			//创建Criteria,根据对应的实体类创建
			Criteria criteria = session.createCriteria(Address.class);
			
			//根据provinces正序排列
			criteria.addOrder(Order.asc("provinces"));
			//根据studentId逆序排列
			criteria.addOrder(Order.desc("studentId"));
			
			addressList = criteria.list();
			transaction.commit();

6、聚合处理(使用已弃用方法)

List<Object> addressList = null;
		try {
			transaction = session.beginTransaction();
			//创建Criteria,根据对应的实体类创建
			Criteria criteria = session.createCriteria(Address.class);
			
			//查询一共多少条数据
//			criteria.setProjection(Projections.rowCount());
			
			//获取单个属性provinces
//			criteria.setProjection(Projections.property("provinces"));
			
			//求studentId的平均数
//			criteria.setProjection(Projections.avg("studentId"));
			
			//查询provinces去重后的数据
//			criteria.setProjection(Projections.distinct(Projections.property("provinces")));
			
			//查询provinces去重后有多少行
//			criteria.setProjection(Projections.countDistinct("provinces"));
			
			//查询studentId最大值
//			criteria.setProjection(Projections.max("studentId"));
			
			//查询studentId最小值
//			criteria.setProjection(Projections.min("studentId"));
			
			//查询studentId求和
			criteria.setProjection(Projections.sum("studentId"));
			
			addressList = criteria.list();
			transaction.commit();

一些小知识

null和empty有什么区别呢?

这里有个null和empty的判断,null就是啥都没有才是null,"“不是null哦。但是empty包括了”"和啥都没有的情况。

项目地址

对应的建表语句也在里面了。
https://gitee.com/mrchen13427566118/ssh_hibernate_learn.git
里面的ssh_hibernate_standard_query。
如果你不知道如何打开,可以看这篇https://blog.csdn.net/weixin_43987277/article/details/116936221里面的第三点

标签:session,studentId,已弃,eclipse,查询,Hibernate,ssh,criteria,Criteria
来源: https://blog.csdn.net/weixin_43987277/article/details/117537187

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有