Hibernate使用Criteria查询
Hibernate属于ORMapping映射框架,所有的操作都应该以对象为主进行使用,那么Query的使用就不符合与这种要求了,所以在查询的基础上又扩充了一个基于对象模式的查询接口:Criteria接口,而这个接口的创建依靠Session接口:
public Criteria createCriteria(Class persistentClass);
【范例】查询全部数据
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.Dept;
import org.hibernate.Criteria;
import java.util.Iterator;
public class CriteriaDemoA {
public static void main(String[] args) {
Criteria criteria = HibernateSessionFactory.getSession().createCriteria(Dept.class);
Iterator<Dept> iter = criteria.list().iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
HibernateSessionFactory.closeSession();
}
}
如果只进行这种简单的查询,那么Criteria接口一定比Query接口方便,但在实际开发中,虽然需要查询全部,但很多时候需要限定查询,所以在Criteria接口里面也支持查询条件的设置,此接口定义了如下增加查询条件的方法:
public Criteria add(Criterion criterion);
这个时候对于所有条件的创建还需要使用另外一个类:org.hibernate.criterion.Restrictions,其定义了如下的操作方法:
- 逻辑运算
方法 | 描述 |
---|---|
public static Conjunction and(Criterion…predicates) | 逻辑与运算(AND) |
public static Disjunction or(Criterion…predicates) | 逻辑或运算(OR) |
public static Criterion not(Criterion…expression) | 逻辑非运算(NOT) |
- 关系运算
方法 | 描述 |
---|---|
public static SimpleExpression eq(String propertyName,Object value) | 等于("==") |
public static SimpleExpression ne(String propertyName,Object value) | 不等于("!=") |
public static SimpleExpression gt(String propertyName,Object value) | 大于(">") |
public static SimpleExpression ge(String propertyName,Object value) | 大于等于(">=") |
public static SimpleExpression lt(String propertyName,Object value) | 小于("<") |
public static SimpleExpression le(String propertyName,Object value) | 小于等于("<=") |
public static SimpleExpression like(String propertyName,Object value) | 模糊查询(“LIKE”) |
public static Criterion in(String propertyName,Collection values) | 分页查询(“IN”) |
public static Criterion between(String propertyName,Object lo,Object hi) | (“BEWTEEN”) |
public static Criterion isNull(String propertyName) | 是否为空(“IS NULL”) |
public static Criterion isNotNull(String propertyName) | 是否非空(“IS NOT NULL”) |
【范例】根据ID查询
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.Dept;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.Iterator;
public class CriteriaDemoB {
public static void main(String[] args) {
Criteria criteria = HibernateSessionFactory.getSession().createCriteria(Dept.class);
criteria.add(Restrictions.eq("deptno",3));
Iterator<Dept> iter = criteria.list().iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
HibernateSessionFactory.closeSession();
}
}
在整个Criteria操作之中,最有用处的操作是IN操作,因为这个接口的IN操作可以直接将要查询的数据以Collection形式保存。
【范例】使用IN查询
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.Dept;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class CriteriaDemoC {
public static void main(String[] args) {
Set<Integer> deptnos = new HashSet<Integer>();
deptnos.add(1);
deptnos.add(3);
Criteria criteria = HibernateSessionFactory.getSession().createCriteria(Dept.class);
criteria.add(Restrictions.in("deptno",deptnos));
Iterator<Dept> iter = criteria.list().iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
HibernateSessionFactory.closeSession();
}
}
【范例】多条件查询
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.Dept;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.Iterator;
public class CriteriaDemoD {
public static void main(String[] args) {
Criteria criteria = HibernateSessionFactory.getSession().createCriteria(Dept.class);
criteria.add(Restrictions.and(Restrictions.gt("deptno",1),Restrictions.like("dname","%人%")));
Iterator<Dept> iter = criteria.list().iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
HibernateSessionFactory.closeSession();
}
}
在使用Criteria接口操作的时候还可以设置排序,里面提供了排序的方法:public Criteria addOrder(Order order)
。
- 升序排列:
public static Order asc(String propertyName);
- 降序排列:
public static Order dasc(String propertyName);
【范例】排序
import com.gub.dbc.HibernateSessionFactory;
import com.gub.vo.Dept;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import java.util.Iterator;
public class CriteriaDemoE {
public static void main(String[] args) {
Criteria criteria = HibernateSessionFactory.getSession().createCriteria(Dept.class);
criteria.addOrder(Order.desc("deptno"));
Iterator<Dept> iter = criteria.list().iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
HibernateSessionFactory.closeSession();
}
}