Hibernate查询——QBC(Query By Criteria)

Criteria基本查询

(1)查询所有属性

Criteria是一个通过组装不同查询条件来获取持久对象的条件类对象,代表特定持久类的一个查询。
Criteria对SQL进行封装,让开发人员可以用对象的方式来对数据库进行操作。

//1.基本的Criteria查询,查询所有属性
	public void testQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaQuery cq = session.getCriteriaBuilder().createQuery(User.class);//先创造条件构造器,通过条件对象,创建条件查询。
			cq.from(User.class);
			List users = session.createQuery(cq).list();
			
			//查询方法一
//			for(int i=0;i<users.size();i++)
//			{
//				User u =users.get(i);
//				System.out.println(u.toString());
//			}
			//查询方法二
//			for(User u: users)
//			{
//				System.out.println(u.toString());
//			}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

条件查询1,查询名字含有李四的User

Criteria实际上只是个容器,如果想要设定查询条件,则要使用add()方法加入Restrictions的条件限制,
最新版函数:

//2.基本的Criteria查询,条件查询1,查询名字含有李四的User
	public void testWhereQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			Predicate username = cb.equal(root.get("name"),"李四");
			cq.where(username);
			List users = session.createQuery(cq).getResultList();
			
			//查询方法一
//				for(int i=0;i<users.size();i++)
//				{
//					User u =users.get(i);
//					System.out.println(u.toString());
//				}
			//查询方法二
//				for(User u: users)
//				{
//					System.out.println(u.toString());
//				}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

条件查询2,查询年龄在0~20的User

//3.基本的Criteria查询,条件查询2,查询年龄在0~20的User
	public void testWhere2QueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			Predicate age1 = cb.ge(root.get("age"),0);
			Predicate age2 = cb.le(root.get("age"),20);
			
			cq.where(cb.and(age1,age2));
			List users = session.createQuery(cq).getResultList();
			
			//查询方法一
//				for(int i=0;i<users.size();i++)
//				{
//					User u =users.get(i);
//					System.out.println(u.toString());
//				}
			//查询方法二
//				for(User u: users)
//				{
//					System.out.println(u.toString());
//				}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

条件查询3,查询名字包含王的User

//4.基本的Criteria查询,条件查询3,查询名字包含王的User
	public void testWhere3QueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			Predicate username = cb.like(root.get("name"), "%王%");
			
			cq.where(username);
			List users = session.createQuery(cq).getResultList();
			
			//查询方法一
//				for(int i=0;i<users.size();i++)
//				{
//					User u =users.get(i);
//					System.out.println(u.toString());
//				}
			//查询方法二
//				for(User u: users)
//				{
//					System.out.println(u.toString());
//				}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

条件查询4,查询包含王的女性且年龄小于18的User

//5.基本的Criteria查询,条件查询4,查询包含王的女性且年龄小于18的User
	public void testWhere4QueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			Predicate username = cb.like(root.get("name"), "%王%");
			Predicate gender = cb.equal(root.get("gender"), "女");
			Predicate age = cb.lt(root.get("age"),18);//小于
			
			cq.where(cb.and(username,cb.and(gender,age)));
			List users = session.createQuery(cq).getResultList();
			
			//查询方法一
//				for(int i=0;i<users.size();i++)
//				{
//					User u =users.get(i);
//					System.out.println(u.toString());
//				}
			//查询方法二
//				for(User u: users)
//				{
//					System.out.println(u.toString());
//				}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

一些其他的例子

(1)查询姓名在李白和李小白之间的User
String userscope[]={“李白”,“李小白”};
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.in(“username”, userscope));
List users = criteria.list();
(2)Restrictions.allEq,参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果。
Criteria criteria = session.createCriteria(User.class);
Map cons = new HashMap();
cons.put(“name”,“李小白”) ;
cons.put(“password”,“123”);
criteria.add(Restrictions.allEq(cons));
List users = criteria.list();
(3)也可以使用逻辑组合来进行查询
例如结合age等于(eq)20或(or)age为空(isNull)的条件:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq(“age”, 40),
Restrictions.eq(“username“,”王二”)
));
List users = criteria.list();
(4)也可以使用逻辑组合来进行查询
例如结合age等于(eq)20或(or)age为空(isNull)的条件:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq(“age”, 40),
Restrictions.eq(“username“,”王二”)
));
List users = criteria.list();
(5)可以使用sqlRestriction()方法来提供SQL语法作限定查询
例如查询username以”大”开头的资料:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.sqlRestriction(“{alias}.username LIKE (?)”, “大%",Hibernate.STRING));//这里是指实际表中的字段名而非属性名
List users = criteria.list();
其中alias将被替换为与User类相关的名称,而?将被替换为大%,也就是第二个参数所提供的值
(6)在SQL撰写时,不必再写WHERE
如果有多个查询条件,例如BETWEEN子句的查询,则可以如下:
Criteria criteria = session.createCriteria(User.class);
Integer[] ages = {new Integer(20), new Integer(40)};
Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
criteria.add(Restrictions.sqlRestriction("{alias}.age BETWEEN (?) AND (?)", ages, types));
List users = criteria.list();
(7)Restrictions的几个常用限定查询方法如下表所示:在这里插入图片描述

Criteria高级查询

使用Criteria进行查询,并使用Order对结果进行排序

//6.基本的Criteria查询,条件查询5,查询包含王的女性且年龄小于18的User,年龄由小到大
	public void testWhere5QueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			Predicate username = cb.like(root.get("name"), "%王%");
			Predicate gender = cb.equal(root.get("gender"), "女");
			Predicate age = cb.lt(root.get("age"),30);//小于
			
			cq.where(cb.and(username,cb.and(gender,age)));
			//cq.orderBy(cb.asc(root.get("age")));//asc:升序
			cq.orderBy(cb.desc(root.get("age")));//desc:降序
			List users = session.createQuery(cq).getResultList();
			
			//查询方法一
//				for(int i=0;i<users.size();i++)
//				{
//					User u =users.get(i);
//					System.out.println(u.toString());
//				}
			//查询方法二
//				for(User u: users)
//				{
//					System.out.println(u.toString());
//				}
			//查询方法三
			Iterator iterator = users.iterator();
			while(iterator.hasNext()) {
				User u=(User)iterator.next();
				System.out.println(u.toString());
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述
在这里插入图片描述
setMaxResults()方法可以限定查询回来的记录数,setFirstResult()设定传回查询结果第一个记录的位置
这两个配合起来,就可以实现简单的分页。
例如返回第5条记录之后的10条记录(如果有的话):
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(5);
criteria.setMaxResult(10);
List users = criteria.list();

统计查询

Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能。
通过Criteria的setProjection()方法应用投影到一个查询。
您可以对查询结果进行统计动作,使用Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法。
例如对查询结果的“age”作平均:
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));
Number avgage = (Number)criteria.uniqueResult();
System.out.println(“平均年龄为:”+avgage);

//7.基本的Criteria查询,统计查询
	public void testStatisticalQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<Number> cq = cb.createQuery(Number.class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			cq.select(cb.avg(root.get("age")));
			Query query = session.createQuery(cq);
			
			Number result = (Number)query.getSingleResult();
			System.out.println(result);
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

查询两个或多个属性

//8.基本的Criteria查询,查询两个或多个属性
	public void testSeveralAttributesQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			cq.multiselect(root.get("age"),root.get("gender"));
			Query query = session.createQuery(cq);
			
			List<Object[]> users = session.createQuery(cq).getResultList();
			
			for (Object[] objects : users) {
				System.out.println(Arrays.toString(objects));
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述

分组查询

//9.基本的Criteria查询,分组查询
	public void testGroupQueryUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {			
			sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂		
			session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例			
			ts = session.beginTransaction();//创建事务

			CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
			CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);//通过条件对象,创建条件查询。
			Root<User> root = cq.from(User.class);
			//创建查询条件
			cq.multiselect(root.get("gender"),cb.avg(root.get("age")));
			cq.groupBy(root.get("gender"));
			Query query = session.createQuery(cq);
			
			List<Object[]> users = session.createQuery(cq).getResultList();
			
			for (Object[] objects : users) {
				System.out.println(Arrays.toString(objects));
			}
			
			ts.commit();//提交事务
		} catch (Exception e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}

在这里插入图片描述


版权声明:本文为weixin_44677005原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。