Criteria相关介绍
Criteria叫标准化条件查询是比HQL更面向对象的查询语句称为QBC(Query By Criteria)
Criteria接口代表一个查询它是一个查询条件的容器通过add()方法向其实例中添加查询条件
Criterion接口代表一种面向对象的查询条件它的实例是作为Criteria接口add()方法的参数添加到Criteria实例中的
Restrictions类是用来创建查询条件Criterion实例的工具类它提供了一系列的静态方法用来设定查询条件并作为Criterion实例返回
具体实现步骤
//创建Criteria查询语句
Criteria criteria = sessioncreateCriteria(Employeeclass)
//给查询出来的语句设定查询条件
Criterion criterion = Restrictionsge(salary new Double())
Criterion criterion = Restrictionslike(loginName z%)
//把查询条件放到Criteria语句
criteriaadd(criterion)
criteriaadd(criterion)
//排序可写可不写
criteriaaddOrder(Orderdesc(id))
List<Employee> list = criterialist()
动态查询
在编程时无法确定要查询的字段即用户在在网页上面自由选择某些查询条件程序根据用户的选择条件动态生成SQL语句进行查询
例子(比如某些网站的高级查询)
//StudentDAOImpljava
public List findStudents(String nameString classes){
Criteria crit=sessioncreateCriteria(Studentclass)
if(name!=null&&name!=){ //如果填写了名字添加查询名字的条件
critadd(Restrictionslike(namename))
}
If(classes!=null&&classes!=}{
critadd(Restrictionseq(classesclasses))
}
CritaddOrder(Orderasc(name)
return critlist()
离线查询
DetachedCriteria类支持离线查询所谓离线查询就是指一个Session范围之外创建好一个查询然后在需要使用时再附加到一个Session实例上来执行它
对于分层的web应用程序来说web层需要传递一个查询条件列表给业务逻辑层业务层对象获得这个条件后依次取出条件值然后拼装出SQL查询语句这里的一个难点是如何将用户的多项查询条件传入业务逻辑层
Criteria与session是绑定的在web层使用DetachedCriteria来构造查询条件然后将这个DetachedCriteria作为方法调用参数传递给业务逻辑层对象而业务层对象获得DetachedCriteria之后可以在session范围内直接构造Criteria进行查询这样查询语句的构造脱离了session范围完全被移植到web层实现
例子
//StudentDAOjava
public List findStudents(DetachedCriteria detchedCriteria){
List list=null;
//打开session开启事务
Criteria Criteria=detachedCriteriagetExecutableCriteria(session)
list=criterialist()
//提交事务关闭session
return list;
}
DetachedCriteria detchedCriteria=DetachedCriteriaforClass(Studentclass)
String name=获取名字;
String age=获取班级;
if(name!=null&&name!=){ //如果填写了名字添加查询名字的条件
detchedCriteriaadd(Restrictionslike(namename))
}
If(classes!=null&&classes!=}{ detchedCriteriaadd(Restrictionseq(classesclasses))
}
detchedCriteriaaddOrder(Orderasc(name)
List list=StudentDAOfindStudents(detchedCriteria)
for(){…}
示例查询(QBE)
根据一个给定的实例类实例来构建一个条件查询的方式先创建一个对象样板然后检索出所有和这个样板相同的对象在查询表单中填写的项可以封装成一个对象这就是对象样板
public static void testQBE(Employee employee){
//开启事务
//根据传入的employee实例来创建查询条件
Example example = Examplecreate(employee)
excludeZeroes() //排除值的属性
excludeProperty(color) //排除指定的属性
ignoreCase() //对所有的字符串类型的属性值忽略大小写比较
enableLike() //对所有的字符串类型的属性值使用like比较
List<Employee> results = sessioncreateCriteria(Employeeclass)
add(example) list()
for (Employee empl : results) {
Systemoutprintln(emplgetLoginName() + + emplgetSalary()) }
//提交事务 //关闭Session }
Employee empl=new Employee()
emplsetLonginName(%z%)
testQBE(empl)
Native SQL Queries
原生SQL查询就是指直接使用标准SQL语句或特定数据库的SQL进行查询对原生SQL查询执行的控制是通过SQLQuery接口进行的通过Session上调用createSQLQuery()来获取这个接口
)实体查询
Hibernate执行原生SQL查询后自动把查询到的表格式的数据集封装到实体对象中
) 标量查询
)定义成命名查询来使用
小结
HQL功能最强大适合各种情况但动态查询构造起来不方便Criteria最适合动态条件查询不太适合统计查询QBE还不够强大只适合相当简单的查询NativeSQL可以实现特定数据库的SQL但可移植不好
针对Web应用来说动态查询首先Criteria但是涉及统计查询和非常复杂的关联查询Criteria就无能为力了这种情况下选择HQLHQL常用来进行实体检索要注意返回的list中的元素是实体还是实体数组QBC 不会忽略配置文件中的预先抓取策略