其他分享
首页 > 其他分享> > eclipse学习(第三章:ssh中的Hibernate)——9.Hibernate里面的标准查询

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

作者:互联网

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