hibernate查询数据库的三种方式
hibernate三种查询使用心得

hibernate的查询SQL,HQL,QBC。
最早接触Hibernate是在2004年,当时怀着忐忑和不安的心情来学习这门技术。
经过这几年的使用和研究,也积累了一定的经验,下面就HQL和QBC查询来谈一下我从工作中得到的一些总结。
本文不会讲什么是Hibernate、什么是ORM、更不会谈怎样使用HQL与QBC.本文的目的是让大家对平常使用最多,也是最广泛的与数据库打交道的两种方式,有一个新的认识。
恩,如果你还不知道Hibernate,大象建议你先去学一下再来看本文,如果你已经是这方面的高手,大可以关掉浏览器,千万不要因为本人的愚见,让你对大象口诛笔伐,进行人身攻击。
HQL和QBC都是查询检索的方式,最开始,我一直使用的都是HQL,因为以前一直用的都是SQL,觉得这东西和SQL差不多,上手很快。
后来又用QBC,因为QBC是基于接口和类的对象化查询,使代码变得很清晰,很整洁。
下面是查询用户表中,id为2,年龄等于21,并且名字以J开头的两种查询语句,它们的结果都是一样,只是不同的表现方式。
HQL:Query query = session.createQuery("from User u where u.id = 2 and u.age = 21 and like 'J%'");List list = query.list();QBC:Criteria criteria = session.createCriteria(User.class);List list = criteria.add(Expression.eq("id", 2)).add(Expression.eq("age", 2)).add(Expression.like("name", "J%")).list();如果查询再复杂一点,需要关联多张表,那上面这个HQL语句就会显得很复杂,比较难以阅读。
Hibernate的检索方式

Hibernate的检索方式Hibernate提供以下几种检索对象的方式。
●导航对象图检索方式。
(根据已经加载的对象,导航到其他对象。
)●OID检索方式。
(按照对象的OID来检索对象。
)●HQL检索方式。
(使用面向对象的HQL查询语言。
)●QBC检索方式。
(使用QBC(Qurey By Criteria) API来检索对象。
)●本地SQL检索方式。
(使用本地数据库的SQL查询语句。
)一、Hibernate的检索方式简介1、HQL检索方式HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL 查询语言有些相识。
在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。
它具有以下功能:●在查询语句中设定各种查询条件。
●支持投影查询,即仅检索出对象的部分属性。
●支持分页查询。
●支持分组查询,允许使用having和group by关键字。
●提供内置聚集函数,如sum()、min()和mac()。
●能够调用用户定义的SQL函数。
●支持子查询,即嵌入式查询。
●支持动态绑定参数。
Session类的find方法及Qurey接口都支持HQL检索方式。
区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,有可能淘汰find方法;而Qurey接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。
注:Qurey接口支持方法链编程风格,它的set方法都返回自身实例,而不是返回void类型。
方法链编程风格能使程序代码更加简洁。
示例代码:Query query = session.createQuery("from Customer as c where "+ "=:customerName andc.age=:customerAge"); // 动态绑定参数query.setString("customerName", "Test");query.setInteger("customerAge", 21);// 执行检索List result = query.list();// 方法链编程风格List result1 = session.createQuery("from Customer as c where =:customerName"+ " andc.age=:customerAge").setString("customerName","Test").setInteger("customerAge", 21).list();∙2、QBC(Qurey By Criteria)检索方式采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。
通常使用的Hibernate通常是三种查询及调用

相关文章:∙SSH通用查询DAO(2)∙应用Hibernate3的DetachedCriteria实现分页查询∙基于spring与hibernate的通用分页实现推荐圈子: GT-Grid更多相关推荐通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(Qurey By Example)检索方式QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。
一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。
QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。
在这种情况下,还是采用HQL检索方式或QBC检索方式。
Java代码1./**2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录3. * @param pageNo4. * 当前页数5. * @param pageSize6. * 每页显示的记录数7. * @param object8. * 将查询条件封装为Object9. * @return 将查询结果封装为Pager返回10. */11.public Pager findPageByExample(int pageNo, int pageSize, Objectobject)12.{13. Pager pager = null;14. try15. {16. Criteria criteria = this.getSession().createCriteria(17. Class.forName(this.getEntity()));18.19. if (object != null)20. {21. criteria.add(Example.create(object).enableLike());22. }23.24. // 获取根据条件分页查询的总行数25. int rowCount = (Integer) criteria.setProjection(26. Projections.rowCount()).uniqueResult();27. criteria.setProjection(null);28.29. criteria.setFirstResult((pageNo - 1) * pageSize);30. criteria.setMaxResults(pageSize);31.32. List result = criteria.list();33.34. pager = new Pager(pageSize, pageNo, rowCount, result);35.36. } catch (RuntimeException re)37. {38. throw re;39. } finally40. {41. return pager;42. }43.44.}注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。
浅谈hibernate的几个查询

一、load和get方法的区别1、load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;二、list和iterator1 、list方法会直接直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;3、什么时候使用最合适呢?个人建议第一次查询使用list直接从数据库中读取所有数据,然后放到了缓存中,后面使用Iterator,直接从缓存中读取,利于提高性能;三、延迟加载1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。
2、hibernate中list和Iterator 区别,延迟加载对于Query接口的list()和Iterator()方法来说,都可以实现获取查询的对象,但是list() 方法返回的是每一个对迪昂都是完整的(对象的每一个属性都被表中的字段填充上了),而Iterator()方法返回的对象中仅包含了主键值(标识符),只有当你对Iterator中的对象进行操作时,Hibernate才会向数据库发送SQL语句来获取属性值。
Hibernate查询详解

Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据.load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。
list和iterator()方法之间的区别:(N+1?)list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).结果集的处理方法不同:list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。
如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。
一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
HQL:HQL是一种面向对象的查询语言,HQL的操作对象是类、实例和属性等。
SQL:sql的操作对象是数据表和列等数据对象。
Hql是完全面向对象的查询语言,因此可以支持继承和多条等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象。
定参数的功能,Query 接口才是真正的HQL查询接口。
//创建一个Query 对象Java代码1Query query = session.createQuery ("from Customer as c where=:customerName and c.age=:customerAge");//动态绑定参数Java代码2query.setString("customerName","Tom");3query.setInteger("customerAge",21);//执行查询语句,返回结果Java代码4List result = query.list();HQL查询步骤:1:获取Hibernate Session对象。
hibernate高级查询

1.将数据部署完成2.通过session完成删除,更新,增加,获取,查询使用session接口: CUD时比较方便.get,loadHibernate的另外的查询方式:1.HQL : Hibernate Query Language2.QBC : Query by Creteria3.SQL3.任务: 通过向导的方式,为fwxx项目添加hibernate框架组件.然后定制映射关联关系.5分钟一,HQL查询1.使用步骤1).得到session 2).使用Query接口的CreateQuery编写HQL语句进行查询3).通过Query接口的方法处理结果示例1: 查询所有的房屋信息:Session session = HibernateSessionFactory.getSession();Query q = session.createQuery("from FWXX "); //此时可以省略等同于“select fwxx from FWXX fwxx “ <select * from tbl_Fwxx>,返回FWXX对象集合List<FWXX> list =q.list();for(FWXX fwxx :list){System.out.println(fwxx);}session.close();示例2: 如果需要查询指定的列时,采用以下代码Query q = session.createQuery("select fwxx.title,fwxx.datefrom FWXX as fwxx "); //FWXX 是类名而不是表的名字 ; as fwxx为该类的对象所起的别名 ; fwxx.title,fwxx.date为 FWXX类的属性名//如果指定了查询对象的列,注意返回的是一个Object数组的形势表示的数据.Iterator it =q.iterate();while(it.hasNext()){Object[] row = (Object[]) it.next();System.out.println(row[0]+"\t"+row[1]);}示例3: HQL条件查询1).支持like,in,> ,>= ,<= ,< between ,not in,2).参数查询,支持”?”,Query q = session.createQuery("select fwxx.fwxx,fwxx.datefrom FWXX as fwxx where fwxx.fwxx like ?");q.setString(0, "%"+fwxx+"%");List objects =q.list();3).定制参数名: 使用”:”+参数名称.Query q = session.createQuery("from FWXX as fwxx where fwxx.zjbetween :zj1 and :zj2"); //q.setDouble("zj1",minZj);q.setDouble("zj2",maxZj);System.out.println(q.getQueryString());//执行的HQL语句查询租金范围在800到2000之间,并且标题包含健翔桥的房屋信息示例4:HQL关联查询查询联系人是”伊先生”的房屋信息发布在那些街道SQL: select*from tbl_fwxx as fw ,tbl_jd as jd wherefw.jdid=jd.jdid and fw.lxr ='伊先生'HQL:select jd from FWXX fwxx ,JD jd where fwxx.jdid=jd.jdid and fwxx.lxr=’伊先生’常见错误:.hibernate.QueryException: could not resolve property:jd of: com.accp.fwxx.entity.FWXX [select jd fromcom.accp.fwxx.entity.FWXX fwxx ,com.accp.fwxx.entity.JDjd where fwxx.jd=jd and fwxx.lxr='伊先生']原因: FWXX类的jd属性实际为JD. 注意,如果出现了该类型不存在的属性(包含属性的大小写错误),会引发该异常.2.由于sql错误引发的异常,注意Caused by部分的错误提示Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute queryat ...Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'’' 附近有语法错误。
Hibernate查询3

• 查询没有员工的部门
> String hql=‚from Dept as d where d.employees is
empty‛
• 关联查询
> 隐式内连接,join,left join,right join
• 查询编号为” 1”的部门下面所有的员工(隐式)
> String hql="select emp from Dept as d,Employee emp
where d.deptId = emp.dept.deptId anห้องสมุดไป่ตู้ d.deptId = 1 “
• 查询编号为” 1”的部门下面所有的员工(join)
> String hql=“select emp from Dept as d join d.employees
emp where d.deptId = 1“
• 注意
> > > >
[]中的内容可以省略 MappedObject为Hibernate已经加载的映射对象 查询条件,排序使用的都是对象的属性 返回包含MappedObject的List集合
• 完成业务:使用HQL语句查询编号为001的员工信 息
• 查询所有担任保安职责的员工信息
> Hql:“from Employee as emp where
查 > query.setMaxResult(endIndex)//endIndex:往后面查几条
Hibernate的优缺点
• Hibernate的优点:
> > > > >
用OOP的数据库访问方式 屏蔽底层数据访问的差异 数据访问代码开发较率高 开放源代码、参考文档详细 使用方便、容易上手
在Java的Hibernate框架中对数据库数据进行查询操作

这篇文章主要介绍了Java的Hibernate框架中对数据库数据进行查询操作的方法,Hibernate 是Java的SSH三大web开发框架之一能列表:DISTINCT关键字只计算在该行设定的唯一值。
下面的查询将只返回唯一的计数:最后,我们将创建应用程序类的main()方法来运行,我们将使用Criteria查询的应用程序:?1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829 importjava.util.List;importjava.util.Date;importjava.util.Iterator;importorg.hibernate.HibernateException;importorg.hibernate.Session;importorg.hibernate.Transaction;importorg.hibernate.SessionFactory;importorg.hibernate.Criteria;importorg.hibernate.criterion.Restrictions;importorg.hibernate.criterion.Projections;importorg.hibernate.cfg.Configuration;publicclassManageEmployee {privatestaticSessionFactory factory;publicstaticvoidmain(String[] args) {try{factory = newConfiguration().configure().buildSessionFactory();}catch(Throwable ex) {System.err.println("Failed to create sessionFactory object."+ ex);thrownewExceptionInInitializerError(ex);}ManageEmployee ME = newManageEmployee();/* Add few employee records in database */Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);Integer empID3 = ME.addEmployee("John", "Paul", 5000);Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);/* List down all the employees */ME.listEmployees();/* Print Total employee's count */ME.countEmployee();/* Print Toatl salary */ME.totalSalary();}/* Method to CREATE an employee in the database */public Integer addEmployee(String fname, String lname, int salary){30313233343536373839404142434445464748495051525354555657585960Session session = factory.openSession();Transaction tx = null;Integer employeeID = null;try{tx = session.beginTransaction();Employee employee = new Employee(fname, lname, salary);employeeID = (Integer) session.save(employee);mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}return employeeID;}/* Method to READ all the employees having salary more than 2000 */ public void listEmployees( ){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// Add restriction.cr.add(Restrictions.gt("salary", 2000));List employees = cr.list();for (Iterator iterator =employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next();System.out.print("First Name: " + employee.getFirstName());System.out.print(" Last Name: " + employee.getLastName());System.out.println(" Salary: " + employee.getSalary());}mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}}/* Method to print total number of records */61626364656667686970717273747576777879808182838485868788899091public void countEmployee(){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// To get total row count.cr.setProjection(Projections.rowCount());List rowCount = cr.list();System.out.println("Total Coint: " + rowCount.get(0) );mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}}/* Method to print sum of salaries */publicvoidtotalSalary(){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// To get total salary.cr.setProjection(Projections.sum("salary"));List totalSalary = cr.list();System.out.println("Total Salary: "+ totalSalary.get(0) );mit();}catch(HibernateException e) {if(tx!=null) tx.rollback();e.printStackTrace();}finally{session.close();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hibernate查询数据库的三种方式一、Hibernate的HQL与SQL查询1.Hql(Hibernate Query Language)是面向对象的查询查询方式,HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,提供了类似标准SQL语句的查询方式,同时也提供了面向对象的封装。
HQL查询语句from关键字后面跟的类名+类对象,where后用对象的属性做条件;示例代码:(User是映射数据库的一个类)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String HQLString="from User u whereername='"+userForm.getUsername()+"'";String HQLString="from User u where ername=:uname";Session session=HibernateSessionFactory.currentSession();//获取事务session.beginTransaction();Query query=session.createQuery(HQLString);query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录//提交事务session.getTransaction().commit();//关闭SessionHibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}2.sql是面向数据库表查询,from后面跟的是表名,where后用表中字段做条件;示例代码:([xxdb].[dbo].[student]就是要查询的数据库表)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String SQLString="select*from[xxdb].[dbo].[student]u whereerName='"+userForm.getUsername()+"'";String SQLString=”select*from[xxdb].[dbo].[student]u whereerName=:uname”;Session session=HibernateSessionFactory.currentSession();session.beginTransaction();//Query query=session.createSQLQuery(SQLString).addEntity(User.class);//实体查询Query query=session.createSQLQuery(SQLString).addScalar("userid",StandardBasicTypes.INTEGER).addScalar("username",StandardBasicTypes.STRING).addScalar("password",StandardBasicTypes.STRING).addScalar("gender",StandardBasicTypes.INTEGER);//标量查询query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录session.getTransaction().commit();HibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}3.对比hql和sql查询方式我们可以发现他们之间的不同:a.首先是查询语句的不同,hql语句from后面跟的类名+类对象,where后用对象的属性做条件,而sql语句from后面跟的是表名,where后用表中字段做条件,这也就是面向对象和面向数据库的一个区别。
(上面例子中的User类映射的就是数据库中的[xxdb].[dbo].[student]表);b.创建查询对象的方法有所不同,hql是creatQuery,而sql是creatSQLQuery;c.Hql可以省略select关键字而sql不能省略。
4.hql和sql查询语句原则上都可以用拼接的方式书写查询条件,但为了为了防止SQL注入漏洞的产生一般用参数绑定的方式,参数绑定的方式有多种:按参数名称绑定query.setString(“uname”,“老谢”),按参数位置绑定query.setString(0,”laoxie”),setParameter()方法,setProperties()方法,setProperties方法命名参数与一个对象的属性值绑定在一起,如下程序代码:User user=new User();user.setUserName(“谢谢”);user.setGender(“1”);Query query=session.createQuery(from user u where ername=:name and u.gender=:gender);query.setProperties(user);setProperties()方法会自动将user对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。
二、Hibernate条件查询使用Hibernate时,即使不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,可以从Java物件的观点来组合各种查询条件,由Hibernate自动产生SQL语句,而不用特别管理SQL与数据库相依的问题。
Criteria criteria=session.createCriteria(User.class);List users=criteria.list();for(Iterator it=users.iterator();it.hasNext();){User user=(User)it.next();System.out.println(user.getId()+"/t"+user.getName()+"/"+user.getAge());}Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有记录,设定档中设定了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL语句之产生:Hibernate:select this_.id as id0_0_,this_.name as name0_0_,this_.age as age0_0_from T_USER this_;Criteria基本查询条件设定,使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料:Criteria criteria=session.createCriteria(User.class);criteria.add(Restrictions.gt("age",new Integer(20)));criteria.add(Restrictions.lt("age",new Integer(40)));Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件;Restrictions的几个常用限定查询方法如下所示:方法说明Restrictions.eq等于Restrictions.allEq使用Map,使用key/value进行多个等于的比对Restrictions.gt大于>Restrictions.ge大于等于>=Restrictions.lt小于<Restrictions.le小于等于<=Restrictions.between对应SQL的BETWEEN子句Restrictions.like对应SQL的LIKE子句Restrictions.in对应SQL的in子句Restrictions.and and关系Restrictions.or or关系排序您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()):Criteria criteria=session.createCriteria(User.class);criteria.addOrder(Order.asc("age"));限定查询记录数Criteria的setMaxResults()方法可以限定查询回来的记录数,如果配合setFirstResult()设定传回查询结果第一条记录的位置,就可以实现简单的分页,例如传回第51条之后的50条记录如果有的话):Criteria criteria=session.createCriteria(User.class);criteria.setFirstResult(51);criteria.setMaxResults(50);统计动作您可以对查询结果进行统计动作,使用org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.avg("age"));分组还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有20、20、25、30,则以下会显示20、25、30:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.groupProperty("age"));List users=criteria.list();上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:Hibernate:select this_.age as y0_from T_USER this_group by this_.age结论Hibernate的Criteria API可以让你使用物件的方式,组合出查询数据库的条件,Hibernate会自动依你所使用的数据库,动态产生SQL语句,让你的应用程式在存取数据库时,不致于因撰写了特定的SQL而相依于特定的数据库,如果你不熟悉SQL语句的撰写,也可以试着使用Criteria来解决查询数据库的需求。