心得12-hibernate的QBC语句

1. Criteria相关介绍

Criteria叫标准化条件查询是比HQL更面向对象的查询语句。称为QBC(Query By Criteria

Criteria接口:代表一个查询。它是一个查询条件的容器,通过add()方法向其实例中添加查询条件。

Criterion接口:代表一种面向对象的查询条件。它的实例是作为Criteria接口add()方法的参数添加到Criteria实例中的。

Restrictions类:是用来创建查询条件Criterion实例的工具类,它提供了一系列的静态方法用来设定查询条件并作为Criterion实例返回。

2. 具体实现步骤

//1.创建Criteria查询语句

Criteria criteria = session.createCriteria(Employee.class);

//2.给查询出来的语句设定查询条件

Criterion criterion1 = Restrictions.ge("salary", new Double(4000.00));

Criterion criterion2 = Restrictions.like("loginName", "z%");

//3.把查询条件放到Criteria语句

criteria.add(criterion1);

criteria.add(criterion2);

//排序,可写可不写

criteria.addOrder(Order.desc("id"));

List<Employee> list = criteria.list();

3.动态查询

在编程时无法确定要查询的字段。即用户在在网页上面自由选择某些查询条件,程序根据用户的选择条件,动态生成SQL语句进行查询。

  例子:(比如某些网站的高级查询)

//StudentDAOImpl.java

public List findStudents(String name,String classes){

Criteria crit=session.createCriteria(Student.class);

 if(name!=null&&name!=“”){        //如果填写了名字,添加查询名字的条件

        crit.add(Restrictions.like(“name”,name));

  }

If(classes!=null&&classes!=“”}{

       crit.add(Restrictions.eq(“classes”,classes));

}

Crit.addOrder(Order.asc(“name”);

 return crit.list();

4. 离线查询

DetachedCriteria类支持离线查询。所谓离线查询就是指一个Session范围之外创建好一个查询,然后在需要使用时再附加到一个Session实例上来执行它。

    对于分层的web应用程序来说,web层需要传递一个查询条件列表给业务逻辑层,业务层对象获得这个条件后依次取出条件值,然后拼装出SQL查询语句。这里的一个难点是如何将用户的多项查询条件传入业务逻辑层。

Criteria与session是绑定的。在web层,使用DetachedCriteria来构造查询条件,然后将这个DetachedCriteria作为方法调用参数传递给业务逻辑层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。这样,查询语句的构造脱离了session范围,完全被移植到web层实现。

例子:

//StudentDAO.java

public List findStudents(DetachedCriteria detchedCriteria){

    List list=null;   

   //打开session,开启事务

     Criteria Criteria=detachedCriteria.getExecutableCriteria(session);

     list=criteria.list();

   //提交事务,关闭session

   return list;

}

DetachedCriteriadetchedCriteria=DetachedCriteria.forClass(Student.class);

    String name=“获取名字”;

    String age=“获取班级”;

if(name!=null&&name!=“”){        //如果填写了名字,添加查询名字的条件

 detchedCriteria.add(Restrictions.like(“name”,name));

  }

If(classes!=null&&classes!=“”}{     detchedCriteria.add(Restrictions.eq(“classes”,classes));

}

detchedCriteria.addOrder(Order.asc(“name”);

List list=StudentDAO.findStudents(detchedCriteria);

for(){…}

5. 示例查询(QBE

根据一个给定的实例类实例来构建一个条件查询的方式。先创建一个对象样板,然后检索出所有和这个样板相同的对象。在查询表单中填写的项,可以封装成一个对象,这就是对象样板。

public static void testQBE(Employee employee){

    //开启事务

    //根据传入的employee实例来创建查询条件

    Example example = Example.create(employee)

   .excludeZeroes()           //排除0值的属性

   .excludeProperty("color")  //排除指定的属性

   .ignoreCase()              //对所有的字符串类型的属性值忽略大小写比较

   .enableLike();             //对所有的字符串类型的属性值使用like比较

   List<Employee> results = session.createCriteria(Employee.class)

   .add(example)  .list();

     for (Employee empl : results) {

     System.out.println(empl.getLoginName() + "," + empl.getSalary()); }

    //提交事务   //关闭Session }

     Employee empl=new Employee();

     empl.setLonginName(“%z%”);

     testQBE(empl);

6. Native SQL Queries

原生SQL查询:就是指直接使用标准SQL语句或特定数据库的SQL进行查询。对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过Session上调用createSQLQuery()来获取这个接口。

1).实体查询

  Hibernate执行原生SQL查询后,自动把查询到的表格式的数据集封装到实体对象中。

2). 标量查询

3).定义成命名查询来使用

7. 小结

HQL功能最强大,适合各种情况,但动态查询构造起来不方便Criteria最适合动态条件查询,不太适合统计查询QBE还不够强大,只适合相当简单的查询;NativeSQL以实现特定数据库的SQL,但可移植不好

针对Web应用来说,动态查询,首先Criteria,但是涉及统计查询和非常复杂的关联查询,Criteria就无能为力了,这种情况下选择HQL。HQL常用来进行实体检索,要注意返回的list中的元素是实体还是实体数组QBC 不会忽略配置文件中的预先抓取策略。

 

posted @ 2012-12-28 15:33  yangkai_keven  阅读(340)  评论(0编辑  收藏  举报