Hibernate3学习笔记(5)——Hibernate查询技术之Criteria查询

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还是可以使用的,不推荐使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值