您的位置:首页 > 其它

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

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.andand关系
Restrictions.oror关系
Restrictions.sqlRestrictionSQL限定查询
使用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还是可以使用的,不推荐使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: