H_hiberante检索方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

H_hiberante检索方式
Hibernate的检索方式
1:OID检索方式:
按照对象的OID来检索对象,通过Session的get()和load()方法。

2:HQL(Hibernate Query Language)检索方式:
使用面向对象的HQL查询语言,和SQL查询语言很相似。

通过find()方法或者Query接口
3:QBC (Query By Criteria) 检索方式:
使用QBC API来检索对象,API中封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。

4:本地SQL检索方式:
使用本地数据库的SQL查询语句。

5:导航对象图检索方式:
根据已经加载的对象,导航到其他对象,例如:对于已经加载的Customer对象,调用它的getOrders().iterator()方法,就可以导航到所有关联的Order对象。

x
HQL: 使用最广泛的一种查询方式,具有以下功能:
1:在查询语句中设置各种查询条件
2:支持投影查询,即仅查部分属性
3:支持分页查询和连接查询
4:支持分组,允许使用having 和 group by关键字
5:提供内置聚合函数,如max(),sum()等
6:支持子查询
7:支持动态绑定参数
8:能够调用用户定义的SQL函数或标准SQL函数
---------------------------------------------------------------
step1:
通过session的createQuery()方法创建Query对象,包含一个HQL查询语句(查询姓名为tom,且年龄为22岁的Customer对象),可以包含命名参数
Query query = session.createQuery("from Customer as c where /doc/f3814998.html,=:customerName and c.age=:customerAge");
step2:动态绑定参数
query.setString("customerName","tom");
query.setInteger("customerAge",22);
step3:调用query的list()方法执行查询,该方法返回java.util.List 类型的查询结果集,该集合中存放了所有满足查询条件的持久化对象List list = query.list();
注意:HQL与SQL在本质上是不一样的:
1)HQL查询语句是面向对象的,Hibernate负责解析HQL查询语句,然后根据对象-关系映射文件中的映射信息,把HQL查询语句翻译成相应的SQL语句。

HQL查询语句中的主体是域模型中的类及类的属性。

例如:在以上HQL查询语句中,from后面的Customer是持久化类的名字,/doc/f3814998.html,是持久化类的属性的名字。

2)SQL查询语句是与关系数据库绑定在一起的。

SQL查询语句中的主体是数据库表及表的字段。

---------------------------------------------------------------
参数绑定有两种形式:
1:按参数名称绑定
Query query = session.createQuery("from Customer as c where /doc/f3814998.html,=:customerName and c.age=:customerAge");
query.setString("customerName","tom");
query.setInteger("customerAge",22);
2:按参数位置绑定,使用?来定义参数的位置,注意参数的位置是从0开始
Query query = session.createQuery("from Customer as c where /doc/f3814998.html,=? and c.age=?");// 注意:/doc/f3814998.html,=? 不是/doc/f3814998.html,=:?
query.setStr
ing(0,"tom");
query.setInteger(1,22);
---------------------------------------------------------------
* 对查询排序
Query query = session.createQuery("from Customer as c order by /doc/f3814998.html, asc ");
* 分页查询
Query query = session.createQuery("from Customer as c order by /doc/f3814998.html, asc ");
query.setFirstResult(0); //从第几个对象开始检索
query.setMaxResults(10); //设定一次最多检索出的对象数目
List list = query.list();
setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0,默认从0开始。

setMaxResults(int maxResult):设定一次最多检索出的对象数目,默认情况下,会检索出查询结果中所有的对象。

* 检索单个对象(uniqueResult()方法:返回单个对象)
1.在某些情况下,如果只希望检索出一个对象,可以先调用Query接口的setMaxResults(1)方法,把最大检索数目设为1,接下来调用uniqueResult()方法,该方法返回一个Object类型的对象:Query query = session.createQuery("from Customer as c order by /doc/f3814998.html, asc ");
Customer customer = (Customer)query.setMaxResults(1).uniqueResult();
注:如果查询结果会包含多个Customer对象,但是没有调用setMaxResults(1)方法,直接执行uniqueResult()方法,则会抛出NonUniqueResultException异常。

2.如果明确知道查询结果只会包含一个对象,可以不调用setMaxResults(1)方法
Query query = session.createQuery("from Customer as c where c.id=1");
Customer customer = (Customer)query.uniqueResult();
//使用内置聚合函数
Long count = (Long)session.createQuery("select count(*) from Customer c).uniqueResult();
//查询多个字段,返回对象数组
Object[] obj = (Object [])session.createQuery("select max(c.age),min(c.age) from Customer c).uniqueResult();
Integer max =(Integer)obj[0];
Integer min =(Integer)obj[1];
* 实体查询(意义不大):
Customer custmoer = new Customer();
custmoer.setId(new Integer("1")); //id一定要设定,就是用id 去查询
custmoer.setName("aa");
Query query = session.createQuery("from Order o where o.customer = ?")
query.setEntity(0,custmoer); //该参数与一个持久化类的实例绑定
* 批量删除:
Query query = session.createQuery("delete from Address a where a.city = '"+city+"'");
query.executeUpdate();
--------------------------------------------------------------------------------------------------
QBC:主要由Criteria接口,Criterion接口,Restrictions类组成,支持在运行时动态生成查询语句
step1:
通过 session的createCriteria()方法创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
step2:设置查询条件,把查询条件加入到Criteria中(查询姓名以字符T开头,且年龄为21的Customer对象):
Criterion criterion1
= Restrictions.like("name","T%");
Criterion criterion2 = Restrictions.eq("age",new Integer(21));
criteria = criteria.add(criterion1); //add方法用于加入查询条件criteria = criteria.add(criterion2);
step3:调用criteria的list()方法执行查询,该方法返回list结果集List list = criteria.list();
* 对查询排序
Criteria cra = session.createCriteria(Customer.class);
cra.addOrder(Order.asc("name"));
* 分页查询
Criteria cra = session.createCriteria(Customer.class);
cra.addOrder(Order.asc("name"));
cra.setFirstResult(0);
cra.setMaxResults(10);
List list = cra.list();
* 检索单个对象
Criteria cra = session.createCriteria(Customer.class); cra.addOrder(Order.asc("name"));
cra.setMaxResults(10);
Customer customer = (Customer)cra.uniqueResult();
---------------------------------------------------------------
本地SQL
SQLQuery q = session.createSQLQuery("select * from usr"); List list = q.list();
for(int i=0;i<list.size();i++){
Object o[] = (Object [])list.get(i);
System.out.println(o[1]);
}
</list.size();i++){。

相关文档
最新文档