您的位置:首页 > 编程语言 > Java开发

hibernate检索方式详解

2017-09-09 19:30 197 查看
一.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();
Transacti
4000
on 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的多表查询和查询的优化,感兴趣的同学可以自行了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate java ee 框架