posts - 66,  comments - 11,  trackbacks - 0
Hibernate数据检索:
Criteria Query:通过面向对象化的设计,将数据查询条件封装为一个对象。Criteria本身只是一个查询容器,具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。Expression对象具体描述了查询条件。
示例查询并不常用,一方面它的使用比较繁琐,另外从可读性上来讲也不如Expression来的直观。但是在某些情况下却有其特别的用途。
示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项,然后根据用户的选择返回复合条件的结果。实例查询在这里能发
挥其特长:
package com.wyq.demo.common.criteriaquery;

import java.util.Iterator;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;

/** 
 * 
@author 作者 
 * 
@version 创建时间:2008-11-29 上午09:26:48 
 * 类说明 
 
*/
public class TestCriteria {

    
/**
     * @authorwyq
     * @功能:
     * 
@param args
     
*/
    
public static void main(String[] args) {
        Session session 
= null;
        
//新建一个criteria查询容器
        Criteria criteria = session.createCriteria(TUser.class);
        
/*(1)cireria查询
         * 构造查询条件,Expression对象具体描述了查询条件
         * 在Hibernate3中,引入了Restrictions类作为Expression的替代
         *  Expression.eq                  等于
         * Expression.allEq               参数为一个map包好了多个属性-值对应关系
         * Expression.gt                  大于
         * Expression.ge                  大于等于
         * Expression.lt                  小于
         * Expression.le                  小于等于
         * Expression.between             表示某个字段位于2个数之间
         * Expression.like                  模糊查询
         * Expression.in                  范围查询
         * Expression.eqProperty          用于比较2个属性之间的值"field=field"
         * Expression.gtProperty          属性1>属性2
         * Expression.geProperty          属性1>=属性2
         * Expression.ltProperty          属性1<属性2
         * Expression.leProperty          属性1<=属性2
         * Expression.and                 and关系组合
         * Expression.or                  or关系组合
         * Expression.sql                 通过这个方法直接通过SQL语句限定查询条件
         
*/
        
        criteria.add(Expression.eq(
"name","Erica"));
        criteria.add(Expression.eq(
"sex",new Integer(1)));
         
/*(2)示例查询
          * Example类实现了Criterion接口,同样,它也可以用作Criteria的查询条件。Example
          * 的作用是:根据已有对象,查找属性与之相符的其他对象
          * 示例查询最常用的场景是组合查询。我们常常需要在界面上提供若干查询选项,然后
          * 根据用户的选择返回符合条件的结果。
          * Example example = Example.create(cat)
          * excludeZeroes()           //exclude zero valued properties
          * excludeProperty("color")  //exclude the property named "color"
          * ignoreCase()              //perform case insensitive string comparisons
          * enableLike();             //use like for string comparisons
          * List results = session.createCriteria(Cat.class)
          * add(example)
          * list();
          
*/
         TUser exampleUser 
= new TUser();
         exampleUser.setName(
"Erica");
         criteria.add(Example.create(exampleUser));
         
/*
          * (3)复合查询
          * 在原有查询的基础上,针对TUser对象的addresses属性构造了新的查询过滤条件
          
*/
         Criteria addCriteria 
= criteria.createCriteria("addresses");
         addCriteria.add(Expression.like(
"address""%Shanghai%"));
         
/*
          * (4)DetachedCriteria
          * 使Criteria脱离session实例独立存在,这样,我们就可以将某些通用的Criteria
          * 查询条件进行抽离,每次使用时再与当前Session实例绑定以获得更好的代码重用效果
          
*/
         DetachedCriteria deCriteria 
= DetachedCriteria.forClass(TUser.class);
         deCriteria.add(Expression.eq(
"name""Erica"));
         deCriteria.add(Expression.eq(
"sex",new Integer(1)));
         
         Criteria creiterias 
= deCriteria.getExecutableCriteria(session);
         Iterator it 
= criteria.list().iterator();
         
/*
          * (5)高级特性
          * 通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围:
          
*/
         creiterias.setFirstResult(
100);
         creiterias.setMaxResults(
20);
         
/*
          * 排序
          
*/
         creiterias.addOrder(Order.asc(
"name"));
         
/*
          * 分组与统计
          * 分组、统计表达式由Hibernate3新引入的Projections Class进行封装
          * 按照age分组查询
          * Projections.groupProperty()方法实际上是对SQL group by子句的封装。同
          * 样,我们可以通过Projections.avg(),rowCount(),count(),max(),min(),countDistinct()
          * 等方法实现查询统计功能
          
*/
         creiterias.setProjection(Projections.groupProperty(
"age"));
         
    }

}

posted on 2009-11-05 11:23 王永庆 阅读(318) 评论(0)  编辑  收藏 所属分类: HIBERNATE

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(1)

随笔分类

随笔档案

关注blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜