Hibernate中HQL和QBC

Hibernate检索对象的方式

导航对象检索方式

根据已加载的对象,导航到与之关联的对象。

OID检索方式

根据对象的OID检索。Session的get和load方法。

HQL

面向对象的查询语言,与SQL很相似。提供HQL查询的接口,能够执行各种HQL语句。

实例:

Query query=session.createQuery(“select * from Studentas s where  s.name=:studentName and s.age=:studentage”);

query.setString(“studentname”,”zhangsan”);

query.setInterger(“studentage”,20);

List list=query.list();

HQL检索的一般步骤

1)通过SessioncreateQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如customerNamecustomerAge都是命名参数。

2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。

3)调用Querylist()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。

HQL支持链式的编程风格

 

Listresult=session.createQuery("……")

.setString("customerName","Tom")

.setInteger("customerAge",21)

.list();

 

QBC

使用QBC 的API来检索对象,提供了更加面向象对象的检索方式。

实例:

Criteriacriteria=session.createCriteria(Student.class);

Criterion criterion1=Experssion.like(“name”,”a%”);

Criterion criterion2=Expression.eq(“age”,newInteger(20));

criteria.add(criterion1);

criteria.add(criterion2);

List list=criteria.list();

QBC检索的一般步骤

 

 

(1)调用Session的createCriteria()方法创建一个Criteria对象。

(2)设定查询条件。Expression类提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方法用于加入查询条件。

(3)调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法时,Hibernate执行的SQL查询语句为:

select * from CUSTOMERS where NAME like 'T%' andAGE=21;

QBC同样支持链式的编程风格

 

Listresult=session.createCriteria(Customer.class)

.add(Expression.like("name","T%")

.add(Expression.eq("age",newInteger(21))

.list();

 

 

分页查询

 

 

Query和Criteria接口都提供了用于分页显示查询结果的方法:

–setFirstResult(intfirstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索。

–setMaxResult(int maxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。

实例:采用HQL分页

Queryquery=session.createQuery(“from student as s where  order by s.name asc”);

query.setFirstResult(10);

query.setMaxResults(10);

List list=query.list();

采用QBC分页
Critria criteria=session.createCriteria(student.class);

criteria.addOrder(Order.asc(“name”));

criteria.setFirstResult(10);

criteria.setMaxResults(10);

List list=criteria.list();

 

 

 

 

 

实例:

Query query=session.createQuery(“select s.name,s.age  from Student as s”);

List list=query.list();

for(int i=0;i<list.size();i++)

{

   Object[]obj=(Object[])list.get(i);

  System.outprintln(obj[0]);

  System.outprintln(obj[1]);

}

 

当我们查询语句中返回的并不是一个对象而是一个对象的某个或者某几个属性的时候,那么list返回的就是一个个的object数组,因此我们可以通过object数组的方法获得。

另外一种方法就是构造与之对应的构造函数。

例如:在Student中这样的构造方法:

public Student(String name,int age)

{

    this.name=name;

    this.age=age;

}

 

 Query query=session.createQuery(select newStudent(s.name,s.age)  from Student as s);

List list=query.list();

for(;Iteratoriterator=list.iterator();iterator.hasNext();)

{

   Studentstu=(Student)iterator.next();

  System.out.println(stu.name);

  System.out.println(stu.age);

}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值