Criteria 查询
Hibernate支持一种符合Java撰写习惯的查询API,使用Session建立一个net.sf.hibernate.Criteria,您可以在不使用SQL甚至HQL的情况下进行对数据库的查询。 我们以之前所练习过的第一个Hibernate程序完成的结果为例: 入门 02 - 第一个Hibernate程序 如果要使用Criteria来查询所有的User数据,则如下撰写: Criteria crit = session.createCriteria(User.class); List users = crit.list(); for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) { User user = (User) iterator.next(); System.out.println("name: " + user.getName()); System.out.println("age: " + user.getAge()); } 如果我们要为查询限定条件,则可以透过net.sf.hibernate.expression.Expression设定查询条件,Expression拥有许多条件查询方法,举个实际的例子说明: Criteria crit = session.createCriteria(User.class); crit.add(Expression.ge("age", new Integer(25))); List users = crit.list(); Expression的ge()方法即great-equal,也就是大于等于(>=),在上例中我们设定查询age属性大于等于25的User数据。 您也可以设定多个查询条件,例如: crit.add(Expression.gt("age", new Integer(20))); crit.add(Expression.between("weight", new Integer(60),new Integer(80))); List users = crit.list(); 上例中我们查询age大于20,而weight介于60到80之间的User。 您也可以使用逻辑组合来进行查询,例如: crit.add(Expression.or( Expression.eq("age", new Integer(20)), Expression.isNull("age") )); List users = crit.list(); 如果要对结果进行排序,可以使用net.sf.hibernate.expression.Order,例如: List cats = session.createCriteria(User.class) .add(Expression.ge("age", new Integer(20)); .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list(); setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔数据的位置,就可以实现简单的分页,例如: Criteria crit = session.createCriteria(User.class); crit.setFirstResult(51); crit.setMaxResult(50); List users = crit.list(); 上面的例子将传回第51笔之后的资料(51到100)。 实际上,Criteria、Expression、Order等是对SQL进行了封装,让Java程序设计人员可以用自已习惯的语法来撰写查询,而不用使用HQL或SQL(有兴趣的话,可以在组态文件中设定显示SQL,看看对应的SQL),然而Criteria在Hibernate中功能还不是很完美,只能实现一些较为简单的查询,对于查询,Hibernate仍鼓励使用HQL作为查询的首选方式。 Criteria的使用相当简单,这边只介绍一些基本,有兴趣的话,在Hibernate参考手册的第12章中介绍有更多的查询方式。 |
|
来自: WindySky > 《Hibernate入门》