HQL与Criteria查询对比分析

需积分: 8 5 下载量 7 浏览量 更新于2024-09-17 1 收藏 49KB PDF 举报
“HQL与Criteria对照” 在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)和Criteria API是两种主要的查询方式。虽然Criteria查询提供了面向对象的封装,更符合程序员的思维习惯,但HQL由于其丰富的查询功能和灵活性,被Hibernate官方推荐为标准查询方式。HQL不仅涵盖了Criteria的所有功能,还允许用户以类似SQL的语法进行查询,同时保持了面向对象的特性。 HQL的基本结构包括:Select, Update, Delete子句,以及from, where, group by, having, order by等部分。Update和Delete是Hibernate 3新增的功能,使得HQL更加全面,几乎与SQL查询无异。以下是对这两种查询方式的详细比较: 1. 查询所有对象 - HQL:`String hql = "from Employee";` - Criteria:`List<Employee> result = session.createCriteria(Employee.class).list();` 2. 条件过滤 - HQL 支持等价(=)、不等(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等操作: ```java String hql = "from Employee e where e.age = :age"; List<Employee> result = session.createQuery(hql).setInteger("age", age).list(); ``` - Criteria 使用Restrictions类的方法实现相同功能: ```java List<Employee> result = session.createCriteria(Employee.class) .add(Restrictions.eq("age", age)) // 等价 // .add(Restrictions.ne("age", age)) // 不等 // .add(Restrictions.gt("age", age)) // 大于 // .add(Restrictions.ge("age", age)) // 大于等于 // .add(Restrictions.lt("age", age)) // 小于 // .add(Restrictions.le("age", age)) // 小于等于 .list(); ``` 3. 范围查询(between and) - HQL: ```java String hql = "from Employee e where e.age between :fromAge and :toAge"; List<Employee> result = session.createQuery(hql) .setInteger("fromAge", fromAge) .setInteger("toAge", toAge) .list(); ``` - Criteria: ```java List<Employee> result = session.createCriteria(Employee.class) .add(Restrictions.between("age", fromAge, toAge)) .list(); ``` 4. 忽略大小写的条件过滤(iLike, notILike) - 在HQL中,我们可以使用`like`和`not like`配合`lower()`或`upper()`函数来实现忽略大小写的过滤: ```java String hql = "from Employee e where lower(e.name) like :name"; List<Employee> result = session.createQuery(hql) .setParameter("name", name.toLowerCase() + "%") .list(); ``` - Criteria中,可以使用`Restrictions.ilike()`方法: ```java List<Employee> result = session.createCriteria(Employee.class) .add(Restrictions.ilike("name", name + "%")) .list(); ``` 5. 其他高级特性 - HQL支持更复杂的查询,如联接(join)、子查询(subquery)、集合操作(in, not in)等。 - Criteria API也提供相应的API,如`createAlias()`, `createCriteria()`, `add(Subqueries.propertyIn("property", subquery))`等,可以构建复杂的查询条件。 综合来看,HQL和Criteria各有优势。HQL更接近SQL,对于熟悉SQL的开发者来说上手更快,而Criteria则提供了更面向对象的查询方式,更易于在代码中动态构建查询条件。在实际开发中,开发者可以根据项目需求和个人偏好选择适合的查询方式。