hibernate检索方式详解

一.hibernate检索方式简介

通过前面的学习,我们能够在项目中引入hibernate支持,并对有关联的表进行配置。而在项目开发中,对数据库进行最多的操作就是查询,接下来,将详细的介绍几种hibernate中常见的检索方式。

二.hibernate检索方式一:对象图检索方式

对象图检索方式适用于表与表之间有关系时的检索,意思是根据已加载的对象,导航到他的关联对象。利用对象之间的关系进行检索。前提是必须在对象关系映射文件中配置了一对多的关系。检索方式如下。

	Linkman linkman=(Linkman)session.get(Linkman.class,1l);
	Customer customer=linkman.getCustomer();
三.hibernate检索方式二:OID检索方式

oid检索方式是指用session的get()和load()方法加载某条记录对应的对象,如下。

	Customer customer=(Customer)session.get(Customer.class,1l);
	Customer customer=(Customer)session.load(Customer.class,1l);
四.hibernate检索方式三:HQL检索

HQL全称为hibernate query language,是面向对象的查询语言,和SQL查询语言类似,但是它使用的是类,对象,属性的概念,

此种方式是hibernate中使用较多的检索方式。它具有如下的功能:

在查询语句中设定各种查询条件

支持投影查询,即查出对象的部分属性

支持分页查询

支持分组查询,能使用having和group by关键词

提供内置的聚合函数,如sum,min等

能够调用要用户定义的SQL函数

支持子查询

支持动态绑定参数

其基本的完整语法为:selec...from...where...group by...having...order by...asc/desc,通常,检索所有记录时,select可以省略。

下面以前一篇博客的客户表为例举几个例子具体说明HQL语句的使用。

1.基本检索

public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		String hql2 = " from  Customer "; //简单写法,查询全体对象可省略select关键字
		String hql3 = " from java.lang.Object "; 
		
		Query query = session.createQuery(hql3);
		
		List list = query.list();
		
		System.out.println(list);
		
		tx.commit();
		session.close();
		
	}
2.条件查询

public void fun3(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		String hql1 = " from  cn.domain.Customer where cust_id =? ";//完整写法为写上要查询对象的完整包名,方式一,按位置绑定参数
		String hql2 = " from  cn..domain.Customer where cust_id = :id ";//完整写法,方式二,按名称绑定参数
		
		Query query = session.createQuery(hql2);
		
//		query.setParameter(0, 2l);//方式一,确定参数
		query.setParameter("id", 2l);//方式二,指定参数
		
		
		List list = query.list();
		
		System.out.println(list);
		//----------------------------------------------------
		tx.commit();
		session.close();
		
	}

3.分页查询

public void fun4(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		String hql1 = " from  cn.domain.Customer  ";//完整写法,查询对象的完整包名
		
		Query query = session.createQuery(hql1);
		
		//limit ?,?
		// (当前页数-1)*每页条数
		query.setFirstResult(2);//开始条数
		query.setMaxResults(2);//一次检索条数
		
		List list = query.list();
		
		System.out.println(list);
		//----------------------------------------------------
		tx.commit();
		session.close();
		
	}
其他的检索方式可自行了解,在这里要再次强调, HQL语句是面向对象的查询(和hibernate一样,整个操作都是面向对象的),读者应注意体会这一点。

五.hibernate的第四种检索方式:QBC检索

QBC全称是query by criteria,它是由criteria接口,Criterion接口和expression类组成,criteria接口由session进行创建,是hibernate的一个查询接口。criterion是criteria的查询条件设定接口,在criteria中提供add方法添加查询条件。criterion类中提供了大量的静态查询条件。常用方法如下。

以下,是QBC查询的几种常用的形式

1.基本查询

	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		//不为查询设置任何条件,寄查询全部对象。
		Criteria c = session.createCriteria(Customer.class);
		
		List<Customer> list = c.list();
		
		System.out.println(list);
		
		tx.commit();
		session.close();
		
	}
2.条件查询

@Test
	//条件语法
	public void fun2(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();

		
		Criteria c = session.createCriteria(Customer.class);
		
		//使用restriction设置查询条件
		c.add(Restrictions.idEq(2l));
		c.add(Restrictions.eq("cust_id",2l));
		
		List<Customer> list = c.list();
		
		System.out.println(list);
		
		//----------------------------------------------------
		tx.commit();
		session.close();
		
	}

3.排序查询

	//排序语法 
	public void fun4(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//----------------------------------------------------
		
		Criteria c = session.createCriteria(Customer.class);
		
		//使用order设置排序的根据
		c.addOrder(Order.asc("cust_id"));//升序
		//c.addOrder(Order.desc("cust_id"));//倒序
		
		List<Customer> list = c.list();
		
		System.out.println(list);
		
		//----------------------------------------------------
		tx.commit();
		session.close();
		
	}
.hibernate的离线查询模式

此种查询模式是对QBC检索方式的改进,比较上面几种方式,可以发现QBC检索方式符合面向对象的习惯,是最符合hibernate设计的初衷的,但是,QBC查询对象的接口criteria的创建依赖于session,而session往往又只在dao层,这时,就有了离线查询对象DetachedCriteria,它可以在其他层对查询对象进行封装。我们可以在web层包数据封装好再直接传给dao层做查询。因演示比较复杂,故省略web层和service层的代码,这两层只要传入一个封装好查询条件的DetachedCriteria,封装方法和Criteria一样

	public void fun1(DetachedCriteria dc){
		
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//将离线对象关联到session
		Criteria c = dc.getExecutableCriteria(session);
		
		List list = c.list();
		
		System.out.println(list);
		tx.commit();
		session.close();
		
	}

七.总结

以上介绍了详细地介绍了hibernate检索的几种方式,其中重点是是hql检索和qbc检索。当然,本博客还未涉及到hibernate的多表查询和查询的优化,感兴趣的同学可以自行了解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值