聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> QBC

QBC

时间:2018-07-01 08:30:04    下载该word文档

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使用起来更为方便。

工具类ExampleCriteria对象指定样本对象作为查询条件

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();

组与统计:

Hibernate3中,对Criteria又增添了新功能,可以支持分组与统计功能,在Hibernate3中增加了Projections以及ProjectionList类,这两个类对分组与统计功能进行了封装,如下代码:

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

criteria.setProjection(Projections.groupProperty(“age”));(1)

List list=criteria.list();

Iterator it=list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

通过(1)处的代码,我们通过Projections类指定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句:

Select age from user group by age;

还可以通过使用Projectionsavg()/rowCount()/count()/max()/min()/countDistinct()等方法来实现统计功能,如下面的代码示例:

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

criteria.setProjection(Projections.avg(“age”));(1)

List list=criteria.list();

Iterator it=list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

通过(1)处的代码,我们实现了对用户平均年龄的统计,当进行检索时,Hibernate会生成类似如下的SQL语句:

Select avg(age) from user;

另外,在SQL语句中的多条件分组与统计功能,可以利用ProjectionList类来实现,如下面代码所示:

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

ProjectionList prolist=Projections.projectionList();

prolist.add(Projections.groupProperty(“age”));

prolist.add(Projections.rowCount());

criteria.setProjection(prolist);

List list=criteria.list();

通过以上代码,实现了对不同年龄人员数量的分组统计,当进行检索时,Hibernate会生成类似如下的SQL语句:

Select age,count(*) from user group by age;

5DetachedCriteria:

Hibernate2中,Criteria实例是与创建它的Session实例具有相同的生命周期的,也就是说,Session实例是它所创建的Criteria实例的宿主,当Session关闭时,寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难,为了实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteria类,DetachedCriteria实例的生命周期与Session实例的生命周期无关,我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离,当需要进行检索时再与Session实例关联,从而获得运行期的Criteria实例。如下面的代码所示:

DetachedCriteria dc= DetachedCriteria.forClass(User.class);

dc.add(Expression.eq(“name”,”zhaoxin”));

dc.add(Expression.eq(“sex”,”1”));

Criteria criteria=dc.getExecutableCriteria(session);

Iterator it=criteria.list().iterator();

while(it.hasNext()){

User user=(User)it.next();

System.out.println(user.getName());

}

正如我们所见,DetachedCriteria的生存周期与session实例无关,当需要进行检索时,通过getExecutableCriteria(session)方法,与当前的Session实例关联并获得运行期的Criteria实例,完成检索。

DetachedCriteria也可以用于完成子查询功能,如下代码所示:

DetachedCriteria dc= DetachedCriteria.forClass(User.class);

dc.setProjection(Projections.avg(“age”));

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

criteria.add(Subqueries.propertyGt(“age”,dc));

List list=criteria.list();

通过Subqueries类,实现了添加子查询的功能,我们将DetachedCriteria所设定的查询条件,当作子查询添加到了运行时Criteria实例的查询条件中,当执行检索时Hibernate会生成类似如下的SQL语句:

Select * from user where age>(select avg(age) from user group by age);

免费下载 Word文档免费下载: QBC

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服