QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate应用中使用QBC查询通常经过3个步骤
(1)使用Session实例的createCriteria()方法创建Criteria对象
(2)使用工具类Restrictions的相关方法为Criteria对象设置查询对象
(3)使用Criteria对象的list()方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(String propertyName,Object value)
等于
Restrictions.allEq(Map propertyNameValues)
使用Map key/value进行多个等于的比对
Restrictions.gt(String propertyName, Object value)
大于 > (gt----->greater than)
Restrictions.ge(String propertyName, Object value)
大于等于 >= (ge----->greater equal)
Restrictions.It(String propertyName, Object value)
小于< (It---->less than)
Restrictions.Le(String propertyName, Object value)
小于等于<= (le---->less equal)
Restrictions.between(String propertyName, Object lo, Object hi)
对应SQL语句的Between子句
Restrictions.like(String propertyName, Object value)
对应SQL语句的LIKE子句
Restrictions.in(String propertyName, Collection value)
对应SQL语句的in子句
Restrictions.and(Criterion lhs, Criterion rhs)
And关系
Restrictions.or(Criterion lhs, Criterion rhs)
Or关系
Restrictions.sqlRestriction(String sql,Object[] values,Type[] types)
SQL限定查询
工具类Order提供设置排序方式
Order.asc(String propertyName)
升序排序
Order.desc(String propertyName)
降序排序
工具类Projections提供对查询结果进行统计与分组操作
Porjections.avg(String propertyName)
求某属性的平均值
Projections.count(String propertyName)
统计某属性的数量
Projections.countDistinct(String propertyName)
统计某属性的不同值的数量
Projections.groupProperty(String propertyName)
指定一组属性值
Projections.max(String propertyName)
某属性的最大值
Projections.min(String propertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(String propertyName)
返回某属性值的合计
QBE查询
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。QBE查询的功能子集,虽然QBE没有QBC功能大,但是有些场合QBE使用起来更为方便。
工具类Example为Criteria对象指定样本对象作为查询条件
Java代码
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
Customer c = new Customer();
c.setCname("Hibernate");
Criteria criteria = session.createCriteria(Customer.class);
Criteria.add(Example.create(c));
Iterator it = criteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
Customer c = new Customer();
c.setCname("Hibernate");
Criteria criteria = session.createCriteria(Customer.class);
Criteria.add(Example.create(c));
Iterator it = criteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
QBC分页查询
Criteria为我们提供了两个有用的方法:setFirstResult(int firstResult)和setMaxResults(int maxResults).
setFirstResult(int firstResult)方法用于指定从哪一个对象开始检索(序号从0开始),默认为第一个对象(序号为0);setMaxResults(int maxResults)方法用于指定一次最多检索出的对象数目,默认为所有对象。
Java代码
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = null;
Criteria criteria = session.createCriteria(Order.class);
int pageSize = 15;
int pageNo = 1;
criteria.setFirstResult((pageNo-1)*pageSize);
criteria.setMaxResults(pageSize);
Iterator it = criteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = null;
Criteria criteria = session.createCriteria(Order.class);
int pageSize = 15;
int pageNo = 1;
criteria.setFirstResult((pageNo-1)*pageSize);
criteria.setMaxResults(pageSize);
Iterator it = criteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
QBC复合查询
复合查询就是在原有的查询基础上再进行查询。例如在顾客对定单的一对多关系中,在查询出所有的顾客对象后,希望在查询定单中money大于1000的定单对象。
Java代码
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
Criteria cuscriteria = session.createCriteria(Customer.class);
Criteria ordCriteria = cusCriteria.createCriteria("orders");
ordCriteria.add(Restrictions.gt("money", new Double(1000)));
Iterator it = cusCriteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
Session session = HibernateSessionFactory.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
Criteria cuscriteria = session.createCriteria(Customer.class);
Criteria ordCriteria = cusCriteria.createCriteria("orders");
ordCriteria.add(Restrictions.gt("money", new Double(1000)));
Iterator it = cusCriteria.list().iterator();
ts.commit();
HibernateSessionFactory.closeSession();
QBC离线查询
离线查询又叫DetachedCriteria查询,它可以在Session之外进行构造,只有在需要执行查询时才与Session绑定。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hi_jess/archive/2009/10/08/4641237.aspx
分享到:
相关推荐
但是,对于简单的查询,HQL的语法可能比QBC显得更冗长,学习曲线也较陡峭。 在实际开发中,如何选择QBC和HQL,往往取决于项目需求和团队成员的熟悉程度。对于那些强调快速开发、查询条件较为简单的项目,QBC可能是...
首先,HQL是Hibernate专门设计的一种面向对象的查询语言,它的语法类似于SQL,但更注重对象而非表。例如,如果我们有一个`User`实体,我们可以使用HQL来获取所有用户: ```java Session session = sessionFactory....
在Java开发中,Query by Criteria(QBC)是一种非常实用且灵活的对象查询方式,它允许开发者通过构造复杂的查询条件来获取数据库中的数据。QBC通常与Hibernate框架结合使用,为开发者提供了一种更为面向对象的方式来...
例如,按学生名及年龄查询Students对象: ```java Query query = session.createQuery("from Students s where s.name=? and s.age=?"); query.setString(0, "Andy"); query.setInteger(1, 26); ``` - 定义...
在 Hibernate 中进行查询是其核心功能之一,本文将详细介绍 Hibernate 的几种查询方式,包括 HQL (Hibernate Query Language) 查询、QBC (Query By Criteria) 查询以及 QBE (Query By Example) 查询,并结合示例代码...
### Hibernate中的HQL与QBC查询详解 #### 一、引言 Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了Java开发者与数据库交互的过程。本文将深入探讨Hibernate中两种常用的查询语言——HQL...
QueryOver是NHibernate(.NET版Hibernate)引入的一个高级查询API,但也可以在Java Hibernate中使用,它提供了更丰富的查询语法。虽然在Java中使用QueryOver不如使用Criteria API常见,但在某些场景下,QueryOver能...
例如,当执行一个HQL查询时,Hibernate会先将HQL语句转化为AST(抽象语法树),再生成对应的SQL语句,最后通过JDBC接口执行SQL并处理结果。在这个过程中,我们可以学习到如何优化查询性能,如避免N+1查询问题,以及...
HQL是Hibernate特有的面向对象的查询语言,其语法类似于SQL,但操作的是对象和集合。它可以更自然地映射到Java对象。例如,查找所有年龄大于30岁的用户: ```java String hql = "FROM User WHERE age > :age"; ...
而HQL则是NHibernate提供的一种查询语言,它允许开发人员使用类似于SQL的语法来查询数据库,同时保持了面向对象的特性。 ### NHibernate HQL条件查询详解 #### QBC(Query By Criteria)与HQL对比 在NHibernate中...
1. **s2sh_relation20_HQL.zip**: 包含了关于HQL查询的示例代码和说明,可以帮助你掌握基本的HQL语法和使用方法。 2. **s2sh_relation21_QBC.zip**: 提供了Query by Criteria的实践案例,通过解压和运行这些代码,你...
2. **教育应用**:对于那些熟悉QBasic语法的初学者,他们可以通过这个转换器更容易地进入JavaScript的世界,而不必从头学习一种全新的语法。 3. **历史保留**:QBasic有很多经典的教学程序和小游戏,转换器可以使得...
- `sqlRestriction()`方法允许直接插入SQL片段,但请注意,这将使查询依赖于数据库的SQL语法,例如:`Restrictions.sqlRestrictionSql 限定查询,qbc 添加 sql` 7. **QBE(Query By Example)**: - 基于实例对象...
HQL支持标准的SQL查询语法,并在此基础上提供了面向对象的查询方式,使得查询操作更加灵活和强大。 #### 1. HQL基本查询 - **通过Iterator遍历已加载的集合** 使用`iterator()`方法遍历已加载的数据集,如`order...
为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,或者使用第三方库如MyBatis的动态SQL功能。本文主要讨论使用XML配置和FREEMARKER的方法。 四、XML配置SQL 在Hibernate中,...
在Java开发中,Hibernate是一个流行的持久化框架,它简化了数据库操作,将对象与关系数据库之间的映射管理自动化。...无论是HQL的面向对象语法,还是QBC的条件构建,都能帮助开发者更高效地管理数据库操作。
HQL 是一种基于 SQL 的查询语言,它可以使用 SQL 语法来查询数据。例如,我们可以使用以下代码来查询所有的 Student 对象,其中 name 字段值为某个字符串的记录: ```java String hql = "select s.name ,avg(s.age)...
### Hibernate 查询方式与批处理及连接池配置详解 #### 一、Hibernate 查询方式介绍 Hibernate 是一款优秀的 ORM(对象关系映射)框架,它能够极大地简化数据库操作,并提供多种查询方式来满足不同的业务需求。 #...
QBC使用`Criteria`、`Criterion`和`Expression`接口来定义查询条件。 **特点**: - **灵活性**:可以动态地添加查询条件。 - **类型安全**:使用类型安全的API,减少运行时错误。 - **高级功能**:支持分页、排序等...