Criteria查询又称为对象查询,它使用一种封装了基于字符串形式的查询语句的API来查询对象。
在使用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 | 以某个字符为结尾进行匹配 |
Criterion的实例可以通过Restrictions工具类来创建,Restrictions提供了大量的静态方法来创建Criterion查询条件。
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限定查询 |
使用Criterion并通过Restrictions工具类,可以实现关联查询。
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还是可以使用的,不推荐使用。