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)通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。
(2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。
(3)调用Query的list()方法执行查询语句。该方法返回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);
}