我觉得有必要写一个hibernate的总结性随笔,从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询

           如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。

使用主键id加载对象(load(),get());

要用到Session接口的load方法。

load(Class theClass, Serializable id) load(Class theClass, Serializable id, LockMode lockMode) load(Object object, Serializable id) 

通过对象导航,比如通过stu.getTeam()得到team的实例



注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete);

针对web应用来说,大部分常规查询都是动态条件查询,所以首选使用Criteria,并且Hibernate3提供了DetachedCriteria,可以在web层构造好DetachedCriteria再进入session执行查询,非常方便实用的特性。

但是涉及到统计查询和非常复杂的关联查询,Criteria就无能为力了,这种情况下我选择使用HQL。


HQL查询

HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。

1.利用Query接口,Query由Session里的createQuery()来产生一个查询:

     不带参数的查询(这类比较简单):
          Query query=session.createQuery("select user from User as user");

     带参数的查询:示例代码:
          
static void query(String name){   Session s=null;   try{    s=HibernateUtil.getSession();        //from后面是对象,不是表名    String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。    Query query=s.createQuery(hql);    query.setString("name", name);        List<Admin> list=query.list();        for(Admin admin:list){     System.out.println(admin.getAname());    }   }finally{    if(s!=null)    s.close();   }  }




2.利用Session接口的find查询:
find(String query) find(String query, Object[] values, Type[] types) find(String query, Object value, Type type) 均返回list 


如:
List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING) List list=session.find("select user from Users as user where user.name=? and user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,Hibernate.STRING})



{推荐使用Query的方法进行查询}
3.hibernate综合查询解决方案,用Query
    大家从第一部分可以看到,带有参数的查询,必须使用到Query接口,如上边:
Query query=session.createQuery("select users from Users as users where users.name=?"); query.setString(0,name)//假设name为传过来的参数

但是在系统中如何才能写一个公用的查寻方法呢?咋一看,似乎是不可以的,因为每一次查询的参数不一样,参数的数量不一样(如下代码),那么我们如何提取共性呢?
Query query=session.createQuery("select users from Users as users where users.name=? and users.pw=?"); query.setString(0,name)//假设name为传过来的参数 query.setString(1,pw); 大家从第一部分可以看到,带有参数的查询,必须使用到Query接口,如上边: Query query=session.createQuery("select users from Users as users where users.name=?"); query.setString(0,name)//假设name为传过来的参数


但是在系统中如何才能写一个公用的查寻方法呢?咋一看,似乎是不可以的,因为每一次查询的参数不一样,参数的数量不一样(如下代码),那么我们如何提取共性呢?
Query query=session.createQuery("select users from Users as users where users.name=? and users.pw=?"); query.setString(0,name)//假设name为传过来的参数 query.setString(1,pw); 


 

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

对象化查询Criteria方法


static void cri(String name,String password){   Session s=null;   try{    s=HibernateUtil.getSession();        Criteria c=s.createCriteria(Admin.class);    c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或    c.add(Restrictions.eq("apassword", password));        List<Admin> list=c.list();    for(Admin admin:list){     System.out.println(admin.getAname());    }   }finally{    if(s!=null)    s.close();   }  }

适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。

动态分离查询DetachedCriteria

 

static List dc(DetachedCriteria dc) {    Session s = HibernateUtil.getSession();   Criteria c = dc.getExecutableCriteria(s);   List rs = c.list();   s.close();   return rs;  }      DetachedCriteria dc = DetachedCriteria.forClass(User.class);   int id = 1;   if (id != 0)    dc.add(Restrictions.eq("id", id));   Date age = new Date();   if (age != null)    dc.add(Restrictions.le("birthday", age));   List users = dc(dc);   System.out.println("离线查询返回结果:" + users);



适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限。

例子查询


static List example(User user) {   Session s = HibernateUtil.getSession();   List<User> users = s.createCriteria(User.class).add(     Example.create(user)).list();   // List<User>   // users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())   // .createCriteria("child").add((Example.create(user))).list();   return users;  } 


适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。


sql查询


static List sql() {    Session s = HibernateUtil.getSession();   Query q = s.createSQLQuery("select * from user").addEntity(User.class);   List<User> rs = q.list();   s.close();   return rs;  }



适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象。

命名查询

 

static List namedQuery(int id) {   Session s = HibernateUtil.getSession();   Query q = s.getNamedQuery("getUserById");   q.setInteger("id", id);   return q.list();  }


 


<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping>     <class name="com.sy.vo.User" table="user" catalog="news">             </class>     <!-- 命名查询:定义查询条件 -->     <query name="getUserById">      <![CDATA[from User where id=:id]]>     </query>     <!-- 命名查询中使用sql,不推荐使用,影响跨数据库     <sql-query name="getUserById2">      <![CDATA[select * from User where ]]>     </sql-query> --> </hibernate-mapping> 



 

适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。

 

**************精品软件推荐:NetBeans6.5 java和PHP开发人员的利器*****************

程序员杂志上robbin推荐了这个IDE,于是昨天下载了一个,个人感觉很好用。以下是我觉得比较好的地方:

NetBeans6.5(最新版)是一个免费的IDE工具,很利于推广。

基于JDK5和6,基于tomcat6,mysql5。

支持插件,有完美汉化的开发环境,利于新手使用。

目前支持J2SE,J2EE(JSF,EJB,Hibernate,Spring,JPA),J2ME,
PHP,Ruby,C/C++,Groovy,JavaFX,js......的开发。

C/C++需要自己添加配置,默认不支持编译。Ruby默认有内置解析器。

别的支持有待尝试。

具备自动提示,但是感知速度较慢,不够强。

xml配置文件操作智能化,方便开发。

内存占用少160MB左右,软件大小不到250MB。

下载地址:http://www.xdowns.com/soft/38/121/2007/soft_36782.html