Criteria查询

1、使用Criteria查询数据
Criteria查询是Hibernate提供的一种查询方式
 
 
2、设定查询条件(Restrictions)
 
比较运算
Restrictions.eq( )
 
范围运算
Restrictions.in( )
 
字符串模式匹配
Restrictions.ilike( )/like( )
 
逻辑运算
Restrictions.or( )
 
集合运算
Restrictions.isEmpty( )
 
示例代码:
public List findByCriteria(Object[] arg) {
return HibernateSessionFactory.getSession()
.createCriteria(Users.class)
// and
.add(Restrictions.eq("id", 1014))
.add(Restrictions.eq("password", 123))
// 与条件
// or
.add(Restrictions.or(Restrictions.eq("id", 1014),
Restrictions.eq("password", 123)))
// 或条件两个之间
.add(Restrictions.disjunction()
.add(Restrictions.eq("id", 1014))
.add(Restrictions.eq("name", "小明")))
 
// 各种条件
.add(Restrictions.between("id", "1000", "1020"))
.add(Restrictions.like("name", "李"))
.add(Restrictions.ilike("name", "李"))
// 不区分大小写
.add(Restrictions.ilike("name", "李", MatchMode.START))
// 在开头MatchMode.START 在结尾MatchMode.END 任何地方MatchMode.ANYWHERE、严格匹配MatchMode.EXACT
.add(Restrictions.in("id", arg))
.add(Restrictions.isEmpty("house"))// 是空Users.house
.add(Restrictions.not(Restrictions.isEmpty("house")))// 取反
.add(Restrictions.isNull("name"))// 为空
.add(Restrictions.isNotNull("name"))// 为空
.add(Restrictions.sizeEq("house", 5))// ge gt le lt
.add(Restrictions.ne("id", 5))// id 不等于5
.add(Restrictions.eqProperty("入职时间", "生日时间"))// 自己的属性比较
.add(Restrictions.ge("id", 5))// id大于等于5
.add(Restrictions.geProperty("", ""))// 属性之间的比较 后面大于等于前面
.add(Restrictions.neProperty("", ""))// 属性之间比较不相等
.addOrder(Order.asc(""))//排序升序
.list();
}
 
3、动态查询
public List<Users> test(Map<String, Object> arg) {
Criteria c = HibernateSessionFactory.getSession().createCriteria(Users.class);
 
// .add(Restri1ctions.ge("id", arg.get("id")))
 
if (arg.get("start") != null || arg.get("end") != null)
c.add(Restrictions.between("id", arg.get("start"), arg.get("end")));
if (arg.get("name") != null)
c.add(Restrictions.eq("name", arg.get("name")));
return c.list();
 
}
 
4、排序
Criteria查询使用org.hibernate.criterion.Order类对查询结果排序
 
5、分页
Criteria接口提供了设置分页的方法
setFirstResult(int firstResult)
setMaxResult(int maxResult)
 
6、查询唯一对象
Emp emp = (Emp) session.createCriteria(Emp.class)
.add(Restrictions.isNotNull("salary"))
.addOrder(Order.desc("salary"))
.setMaxResults(1)
.uniqueResult();
 
7、关联
Criteria接口提供了createCriteria()createAlias()方法建立内连接
 
List<Emp> list = session.createCriteria(Emp.class)
.add(Restrictions.ilike("empName", "a", MatchMode.ANYWHERE))
.createCriteria("dept")
.add(Restrictions.eq("deptName", "财务部").ignoreCase()) .list();
 
List<Emp> list = session.createCriteria(Emp.class, "e")
.createAlias("dept ", "d")
.add(Restrictions.ilike("e.empName", "a",
MatchMode.ANYWHERE))
.add(Restrictions.eq("d.deptName", "财务部").ignoreCa
 
se()).list();
 
8、投影
Hibernate提供了org.hibernate.criterion.Projection接口和org.hibernate.criterion.Projections类来支持Criteria投影
List<String> list = session.createCriteria(Dept.class)
.setProjection(Property.forName("dname")).list();
 
List<Object[]> list = session.createCriteria(Emp.class)
.setProjection(
Projections.projectionList()
.add(Property.forName("ename"))
.add(Property.forName("hiredate"))
).list();
 
 
/**查询所有房屋信息,投影查询只要title和ID属性*/
public List<Object[]> findHouseByCriteria4(){
return HibernateSessionFactory.getSession()
.createCriteria(House.class,"h")
.setProjection(Projections.projectionList()
/*.add(Property.forName("h.id").count())
.add(Property.forName("h.title"))*/
.add(Projections.count("h.id"))
.add(Property.forName("h.title"))
.add(Projections.rowCount())//==count(*)
)
.list();
}
 
9、分组
使用Property实现org.hibernate.criterion.Projections类提供了使用聚合函数查询的方法
 
 
 
10、DetachedCriteria
DetachedCriteria和Criteria功能类似
Criteria是由Session对象创建的,DetachedCriteria创建时不需要Session对象可以把DetachedCriteria作为方法参数传来构造查询条件
 
/**使用DetachedCriteria查询所有房屋信息*/
 
public List findHouseUseDetachedCriteria(DetachedCriteria c){
/*Session session=HibernateSessionFactory.getSession();
c.getExecutableCriteria(session).list();*/
return c.getExecutableCriteria(
HibernateSessionFactory.getSession()).list();
}
 
public void findHouseUseDetachedCriteria(){
Transaction tr = null;
tr = HibernateSessionFactory.getSession().beginTransaction();
List<Object[]> houses =null;
try {
DetachedCriteria c =DetachedCriteria.forClass(House.class,"h")
// .add(Restrictions.like("h.title", "居",MatchMode.END))
.setProjection(Projections.projectionList()
.add(Property.forName("h.price").avg().as("hp"))
.add(Property.forName("h.title")))
.addOrder(Order.asc("hp"));
 
houses =dao.findHouseUseDetachedCriteria(c);
for(Object[] row:houses){
System.out.println(row[0]+"--"+row[1]);
}
tr.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tr != null) {
tr.rollback();
}
}
 
}
 
11、总结
 
HQL支持多种连接查询
Hibernate可以在映射文件中定义查询语句
Criteria查询是Hibernate提供的一种查询方式。
Criteria接口提供的分页查询方法和Query接口的相同,主要是setFirstResult()方法和setMaxResult()方法。
Criteria支持连接查询,主要是左外连接和内连接
 
 
posted @ 2016-09-24 18:34  郭鑫  阅读(4152)  评论(0编辑  收藏  举报