Hibernate的检索方式
1 导航对象图检索方式
根据已经加载的对象,导航到其他对象,例如:对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有相关联的Order对象。
2 OID检索方式
按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。
3 HQL检索方式(跨平台检索方式)
Query实例包装了一个HQL(Hibernate Query Language)查询语句,HQL和SQL查询语句有些相似,便HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。简单查询用HQL检索方式。主要是用Session.CreateQuery()方法进行查询
(1)属性查询
Session session=HibernateSessionFactory
.getConfiguration()
.buildSessionFactory()
.openSession();
//查询Customers类中的所有对象
//String hql="from Customers";//查出的对象用
String hql="select c.id,c.name,c.age from Customers c";
Query query=session.createQuery(hql);
List list=query.list();
Iterator it=list.iterator();
while(it.hasNext()){
Object[] arr=(Object[])it.next();
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
(2)参数查询
//查询年纪大于25岁
String hql="select c.id,c.name,c.age from Customers c where c.age>=?";
Query query=session.createQuery(hql);
query.setInteger(0, new Integer(25));
List list=query.list();
Iterator it=list.iterator();
while(it.hasNext()){
Object[] arr=(Object[])it.next();
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
(3)关联查询
//查询一个客户有几张订单
String hql="select c.id,c.name,c.age,o.orderNumber from Customers c ,Orders o where c.id=o.customers";
Query query=session.createQuery(hql);
List list=query.list();
Iterator it=list.iterator();
while(it.hasNext()){
Object[] arr=(Object[])it.next();
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
(4)分页查询
/**
* 分页查询
* @param sql
* 分页用sql查询语句
* 类似:select c.id,c.name,c.age from Customers c order by c.id desc
* @param pageNo
* 要查询第几页
* @param pageSize
* 每一页的大小
* @return
* 返回List结果集
*/
protected List select(String hql,int pageNo,int pageSize){
List results=null;
try{
Query query=getSession().createQuery(hql);
int firstResultIndex=pageSize*(pageNo-1);
query.setFirstResult(firstResultIndex);
query.setMaxResults(pageSize);
results=query.list();
}catch(RuntimeException ex){
throw ex;
}finally{
closeSession();
}
return results;
}
String hql="select c.id,c.name,c.age from Customers c order by c.id desc";
List list=hb.select(hql, 2, 4);
Iterator it=list.iterator();
while(it.hasNext()){
Object[] arr=(Object[])it.next();
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
(5)统计函数查询
Session session=HibernateSessionFactory
.getConfiguration()
.buildSessionFactory()
.openSession();
String hql="select count(c) from Customers c";
Query query=session.createQuery(hql);
Integer count=(Integer)query.uniqueResult();
System.out.print("共有: "+count+"条数据!" );
hql="select avg(c.age) from Customers c";
query=session.createQuery(hql);
Float avgage=(Float)query.uniqueResult();
System.out.print("平均年纪: "+avgage+"岁!" );
4 QBC检索方式(跨平台检索方式)
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象。Criteria接口擅长于执行动态查询。主要是用Session.CreateCriteria()方法进行查询.
复杂查询用QBC检索方式。QBC检索方式主要由Criteria接口、Criterion接口和Expression、Restrictions类组成。
//查询Customers表
//List list=hb.select(Customers.class,new Customers());
Customers customer=new Customers();
customer.setAge(new Integer(25));//查询年纪大于25岁的
Criterion criterion=Restrictions.ge("age", customer.getAge());
List list=hb.select(Customers.class,criterion);
Iterator it=list.iterator();
while(it.hasNext()){
Customers cus=(Customers)it.next();
System.out.println(cus.getId()+"/t"+cus.getName()+"/t"+cus.getAge());
}
动态查询
Customers customer=new Customers();
customer.setAge(25);
//select()方法会根据customer中设定的参数自动拼装SQL语句。完成动查询!
List list=hb.select(customer.getClass(), customer);
Iterator it=list.iterator();
while(it.hasNext()){
Customers cus=(Customers)it.next();
System.out.println(cus.getId()+"/t"+cus.getName()+"/t"+cus.getAge());
}
5 SQL检索方式
主要是用Session.CreateSQLQuery()方法进行查询