QBC数据查询 ——hibernate之查询语句

版权声明:电虫原创~转载时请注明出处! https://blog.csdn.net/qq_40762011/article/details/82887899

叙:之前介绍过hibernate的HQL(hibernate query language)的查询数据方式,现在我学习记录一下关于hibernate的另一个查询数据的方式–QBC,QBC数据查询全称是(Query By Criteria数据查询),下面是我学习的笔记~


QBC数据查询


1. QBC介绍

QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句,因此不需要手动设置查询语句。

QBC查询主要由Criteria接口、Criterion接口和Expression类组成。Criteria接口是Hibernate API中的一个查询接口,它需要有session进行创建。Criterion是Criteria的查询,在Criteria中提供了add(Criterion criterion)方法来添加查询条件。使用QBC检索对象的示例代码如下图所示:

//创建 criteria 对象
	Criteria criteria = session.createCriteria(Customer.class); 
	//设定查询条件
	Criterion criterion = Restrictions.eq("id", 1); 
	//添加查询条件
	criteria.add(criterion); 
	//执行查询,返回查询结果
List<Customer> cs = criteria.list();

上述代码中意思是查询Customer对象所映射的数据表中id为1的数据;

QBC检索是使用的Restrictions对象编写查询条件的,在Restrictions类中提供了大量的静态方法来创建查询条件。其常使用的方法如下表所示:
Restrictions类中查询条件


2 .常见的查询方法

2.1. 基本查询
此查询是QBC的基本查询方式,没有任何修饰,查询所有一张表的所有数据;

    @Test
    	// QBC基本查询
    	public void demo1() {
    		Session session = HibernateUtils.openSession();
    		Transaction bt = session.beginTransaction();
    		
    		Criteria cust = session.createCriteria(Customer.class);
    		List<Customer> list = cust.list();
    		for (Customer customer : list) {
    			System.out.println(customer);
    		}
    
    		bt.commit();
    		session.close();
    	}

QBC查询不需要查询语句,直接在createCriteria()括号中加入索要查询的表的映射对象名;


2.2. 条件查询
条件查询需要使用到add()方法来进行添加查询条件,调用Restrictions类以及这个类中的方法,具体代码如下:

@Test
	// QBC条件查询
	public void demo2() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		//Criteria custo = cust.add(Restrictions.idEq(2l));
		Criteria custo = cust.add(Restrictions.eq("cust_name","天线宝宝"));
		//Criteria custo = cust.add(Restrictions.like("cust_name","%羊%"));//模糊查询
		//Criteria custo = cust.add(Restrictions.gt("cust_id",2l));//id大于2的所有数据
		List<Customer> list = custo.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

代码中使用的Restrictions对象的ideq()方法,这个方法是id值等于括号内设定的id值,然后运行后程序会自动匹对id列的所有值;
当然,也可以用模糊查询like(),范围查询gt()等;


2.3. 分页查询
QBC的分页查询和HQL的分页查询一样,均是由起始索引方法setFirstResult()和每页最大显示数方法setMaxResult()来设置,具体代码如下:

@Test
	// QBC分页查询
	public void demo3() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		cust.setFirstResult(2);
		cust.setMaxResults(2);
		List<Customer> list = cust.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

注意:起始索引值是从0开始的,因此想要打印出以id为n开头的数据时,将索引值设置成n-1方可;


2.4. 排序查询
使用addOrder()方法然后在方法内部调用Order类中的方法,升序或者降序,然后在调用的方法内部设置根据对象的哪个属性进行排序;

@Test
	// QBC排序查询
	public void demo4() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(Customer.class);
		cust.addOrder(Order.desc("cust_name"));
		List<Customer> list = cust.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}

		bt.commit();
		session.close();
	}

2.5. 统计查询
统计查询使用的方法和之前的就有所不同了,使用的是setProjection()方法,然后再方法中调用Projections类的查询规则(就是统计哪方面的数据),详细代码如下:

@Test
	// QBC统计查询
	public void demo5() {
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		
		Criteria cust = session.createCriteria(LinkMan.class);
		cust.setProjection(Projections.rowCount());
		List<Long> list = cust.list();
		System.out.println(list);
		bt.commit();
		session.close();
	}

3. 离线查询

将离线查询的业务流程和传统的criteria的业务流程进行对比:
传统的Criteria查询方式

离线Criteria查询方式

DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session 来使用的一种条件查询对象,我们都知道Criteria对象必须由Session对象来创建。那么也就是说必须先有Session才可以生成Criteria对象。而 DetachedCriteria对象可以在其他层对条件进行封装。
这个对象也是比较有用的,尤其在 SSH 整合以后这个对象经常会使用。 它的主要优点是做些特别复杂的条件查询的时候,往往会在WEB层向业务层传递很多的参数,业务层又会将这些参数传递给DAO层。 最后在 DAO 中拼接 SQL完成查询。有了离线条件查询对象后,那么这些工作都可以不用关心了, 我们可以在WEB层将数据封装好,传递到业务层,再由业务层传递给DAO完成查询。
具体代码如下所示:

@Test
	// QBC离线查询
	public void demo1() {
		// 模拟web/service层的
		// 1.在web层创建获取一个离线查询的对象
		DetachedCriteria lkm = DetachedCriteria.forClass(LinkMan.class);
		// 2.在此对象中加入要查询的条件(与正常的Criteria查询中的一样)
		lkm.add(Restrictions.like("lkm_name","熊%"));
		//-----------------------------------------
		
		
		//-----------------------------------------
		// 在dao层中的代码
		Session session = HibernateUtils.openSession();
		Transaction bt = session.beginTransaction();
		// 1.将离线查询对象与session绑定
		Criteria linkMan = lkm.getExecutableCriteria(session);
		List<LinkMan> list = linkMan.list();
		for (LinkMan linkMan2 : list) {
			System.out.println(linkMan2.getLkm_name());
		}

		bt.commit();
	}

这个知识点并不难,根据注释记着就行了;


《本章完》

猜你喜欢

转载自blog.csdn.net/qq_40762011/article/details/82887899
今日推荐