Hibernate3学习笔记(5)——Hibernate查询技术之Criteria查询
2015-06-14 18:45
351 查看
Criteria查询又称为对象查询,它使用一种封装了基于字符串形式的查询语句的API来查询对象。
在使用HQL查询方式,需要定义基于字符串形式的HQL语句,虽然比JDBC代码有所进步,但仍繁琐且不方便使用参数查询。Criteria采用面向对象的方式封装查询条件,Criteria API提供了查询对象的另一种方式,提供了Criteria接口、Criterion接口、Expression类,以及Restrictions类作为辅助。
使用Restrictions辅助类,进行Criteria查询的基本步骤如下所示:
example 1
MatchMode包含的静态变量
Criterion的实例可以通过Restrictions工具类来创建,Restrictions提供了大量的静态方法来创建Criterion查询条件。
Restrictions类提供的方法
使用Criterion并通过Restrictions工具类,可以实现关联查询。
example 2
创建Criteria 对象和使用Restrictions对象编写查询条件,可以采用方法链编程风格。
如下所示:
example 2-1
使用Criteria 并通过Restrictions工具类,也可以实现分页查询。
example 3
在Criterion查询中,除了使用Restrictions 工具类外,还可以使用Expression类实现查询。
example 4
Restrictions是hibernate3代替hibernate2中的Expression,但在hibernate3中Expression还是可以使用的,不推荐使用。
在使用HQL查询方式,需要定义基于字符串形式的HQL语句,虽然比JDBC代码有所进步,但仍繁琐且不方便使用参数查询。Criteria采用面向对象的方式封装查询条件,Criteria API提供了查询对象的另一种方式,提供了Criteria接口、Criterion接口、Expression类,以及Restrictions类作为辅助。
使用Restrictions辅助类,进行Criteria查询的基本步骤如下所示:
example 1
public static void main(String[] args) { TestCriteria tc=new TestCriteria(); //使用对象封装查询条件 Books books=new Books(); books.setTitle("Web应用"); tc.testCriteria_1(books); //tc.testCriteria_2(); //tc.testCriteria_2_1(); //tc.testCriteria_3(); //tc.testCriteria_4(); //tc.testDetachedCriteria(); } /** * 使用Criteria对象进行简单查询 * @param condition */ public void testCriteria_1(Books condition){ //获得session Session session=HibernateSessionFactory.getSession(); //创建Criteria对象 Criteria criteria=session.createCriteria(Books.class); //使用Restrictions对象编写查询条件,并将查询条件加入Criteria对象 if(condition!=null){ if(condition.getTitle()!=null && !condition.getTitle().equals("")){ //按书名进行筛选 criteria.add(Restrictions.like("title", condition.getTitle(), MatchMode.ANYWHERE)); } if(condition.getAuthor()!=null && !condition.getAuthor().equals("")){ //按作者进行筛选 criteria.add(Restrictions.like("author", condition.getAuthor(), MatchMode.ANYWHERE)); } } //排序 criteria.addOrder(Order.asc("id")); //执行查询,获得结果 List list=criteria.list(); //遍历查询结果 Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
MatchMode包含的静态变量
匹配模式 | 说明 |
---|---|
MatchMode.ANYWHERE | 模糊匹配 |
MatchMode.EXACT | 精确匹配 |
MatchMode.START | 以某个字符为开头进行匹配 |
MatchMode.END | 以某个字符为结尾进行匹配 |
Restrictions类提供的方法
方法名 | 说明 |
---|---|
Restrictions.eq | 等于 |
Restrictions.ne | 不等于 |
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关系 |
Restrictions.sqlRestriction | SQL限定查询 |
example 2
/** * 使用Criterion 并通过 Restrictions 工具类,实现关联查询 */ public void testCriteria_2(){ Session session=HibernateSessionFactory.getSession(); Criteria bookCriteria=session.createCriteria(Books.class); //设置从Books类中查询的条件 bookCriteria.add(Restrictions.like("title", "C++",MatchMode.ANYWHERE)); //创建一个新的Criteria实例,以引用pulishers集合中的元素 Criteria publishersCriteria=bookCriteria.createCriteria("publishers"); //设置从关联的Publishers类中查询的条件 publishersCriteria.add(Restrictions.like("name", "清华大学出版社")); List list=publishersCriteria.list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
创建Criteria 对象和使用Restrictions对象编写查询条件,可以采用方法链编程风格。
如下所示:
example 2-1
/** * 采用方法链编程风格,使用Criteria对象进行查询 */ public void testCriteria_2_1(){ Session session=HibernateSessionFactory.getSession(); List list=session.createCriteria(Books.class) .add(Restrictions.like("title", "C++",MatchMode.ANYWHERE)) .createCriteria("publishers") .add(Restrictions.like("name", "清华大学出版社")).list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
使用Criteria 并通过Restrictions工具类,也可以实现分页查询。
example 3
/** * 使用Criterion 并通过 Restrictions 工具类,实现分页查询 */ public void testCriteria_3(){ Session session=HibernateSessionFactory.getSession(); // Criteria criteria=session.createCriteria(Books.class); // //从第一个对象开始查询 // criteria.setFirstResult(0); // //每次从查询结果中返回4个对象 // criteria.setMaxResults(4); // List list=criteria.list(); List list = session.createCriteria(Books.class) .setFirstResult(0) .setMaxResults(4) .list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
在Criterion查询中,除了使用Restrictions 工具类外,还可以使用Expression类实现查询。
example 4
/** * 使用Expression类实现查询 */ public void testCriteria_4(){ Session session=HibernateSessionFactory.getSession(); List list=session.createCriteria(Books.class) //使用Expression类编写查询条件 .add(Expression.like("title", "C++",MatchMode.ANYWHERE)) //对查询结果进行排序 .addOrder(Order.asc("id")).list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
Restrictions是hibernate3代替hibernate2中的Expression,但在hibernate3中Expression还是可以使用的,不推荐使用。
相关文章推荐
- 部分经典算法
- hadoop 异常记录 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times
- [Objective-C] 006_Protocol(协议)
- java web项目中的jsp页面发送ajax请求404错误
- 算法练习:数组配对
- 浏览器缓存机制
- 浏览器缓存机制
- Linux企业运维高效技巧心得及分享
- JSTL标签的具体介绍—内容多多
- 初步理解Python Web WSGI
- keil中对struct结构体静态赋值导致代码急剧膨胀的原因(转)
- android json解析
- Error “can't use subversion command line client : svn” Probably the path to Subversion executable is wrong
- 团队项目
- hiho一下 第五十周
- hiho一下 第五十周(欧拉路径)50
- 关于VS2015支持编译Linux程序的问题
- 第三个spirit(第十四天)
- Oracle安装
- 再论由内而外造就自己