hibernate.的QBC语句(一)

2014-11-24 11:03:43 · 作者: · 浏览: 2
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 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;
}
DetachedCriteria detchedCriteria=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 results = session.createCriteria(Employee.class)
.add(example) .list();