一.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的多表查询和查询的优化,感兴趣的同学可以自行了解。