`
lijun87
  • 浏览: 263594 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

条件查询(Criteria Query)

阅读更多
条件查询(Criteria Query)
现在Hibernate也支持一种直观的、可扩展的条件查询API。目前为止,这个API还没有更成熟的HQL查询那么强大,也没有那么多查询能力。特别要指出,条件查询也不支持投影(projection)或统计函数(aggregation)。

12.1. 创建一个Criteria实例
net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。

Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();
12.2. 缩小结果集范围
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。

List cats = sess.createCriteria(Cat.class)    .add( Expression.like("name", "Fritz%") )    .add( Expression.between("weight", minWeight, maxWeight) )    .list();
表达式(Expressions)可以按照逻辑分组.

List cats = sess.createCriteria(Cat.class)    .add( Expression.like("name", "Fritz%") )    .add( Expression.or(    Expression.eq( "age", new Integer(0) ),    Expression.isNull("age")    ) )    .list();
List cats = sess.createCriteria(Cat.class)    .add( Expression.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )    .add( Expression.disjunction()        .add( Expression.isNull("age") )    .add( Expression.eq("age", new Integer(0) ) )    .add( Expression.eq("age", new Integer(1) ) )    .add( Expression.eq("age", new Integer(2) ) )    ) )    .list();
有很多预制的条件类型(Expression的子类)。有一个特别有用,可以让你直接嵌入SQL。

List cats = sess.createCriteria(Cat.class)    .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING) )    .list();
其中的{alias}是一个占位符,它将会被所查询实体的行别名所替代。(原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)

12.3. 对结果排序
可以使用net.sf.hibernate.expression.Order对结果集排序.

List cats = sess.createCriteria(Cat.class)    .add( Expression.like("name", "F%")    .addOrder( Order.asc("name") )    .addOrder( Order.desc("age") )    .setMaxResults(50)    .list();
12.4. 关联(Associations)
你可以在关联之间使用createCriteria(),很容易地在存在关系的实体之间指定约束。

List cats = sess.createCriteria(Cat.class)    .add( Expression.like("name", "F%")    .createCriteria("kittens")        .add( Expression.like("name", "F%")    .list();
注意,第二个createCriteria()返回一个Criteria的新实例,指向kittens集合类的元素。

下面的替代形式在特定情况下有用。

List cats = sess.createCriteria(Cat.class)    .createAlias("kittens", "kt")    .createAlias("mate", "mt")    .add( Expression.eqProperty("kt.name", "mt.name") )    .list();
(createAlias())并不会创建一个Criteria的新实例。)

请注意,前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤!如果你希望只返回满足条件的kittens,你必须使用returnMaps()。

List cats = sess.createCriteria(Cat.class)    .createCriteria("kittens", "kt")        .add( Expression.eq("name", "F%") )    .returnMaps()    .list();Iterator iter = cats.iterator();while ( iter.hasNext() ) {    Map map = (Map) iter.next();    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);    Cat kitten = (Cat) map.get("kt");}
12.5. 动态关联对象获取(Dynamic association fetching)
可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。

List cats = sess.createCriteria(Cat.class)    .add( Expression.like("name", "Fritz%") )    .setFetchMode("mate", FetchMode.EAGER)    .setFetchMode("kittens", FetchMode.EAGER)    .list();
这个查询会通过外连接(outer join)同时获得 mate和kittens。

12.6. 根据示例查询(Example queries)
net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。

Cat cat = new Cat();cat.setSex('F');cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class)    .add( Example.create(cat) )    .list();
版本属性,表示符属性和关联都会被忽略。默认情况下,null值的属性也被排除在外。

You can adjust how the Example is applied. 你可以调整示例(Example)如何应用。

Example example = Example.create(cat)    .excludeZeroes()           //exclude zero valued properties    .excludeProperty("color")  //exclude the property named "color"    .ignoreCase()              //perform case insensitive string comparisons    .enableLike();             //use like for string comparisonsList results = session.createCriteria(Cat.class)    .add(example)    .list();
你甚至可以用示例对关联对象建立criteria。

List results = session.createCriteria(Cat.class)    .add( Example.create(cat) )    .createCriteria("mate")        .add( Example.create( cat.getMate() ) )    .list();
分享到:
评论
1 楼 matthew_chen 2008-11-14  
[i][/i][u][/u]
引用

    [*]

    [*]
[img][/img][url][/url][flash=200,200][/flash][b][/b]

相关推荐

    Hibernat 使用Criteria查询多对多关系(SET集合)条件

    Hibernat 使用Criteria查询多对多关系(SET集合)条件

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    Hibernate中使用Criteria Query各种QBC查询

    HIBERNATE_QUERY

    如果希望通过编程的方式创建查询,Hibernate提供了完善的按条件(Query By Criteria, QBC)以及按样例(Query By Example, QBE)进行Hibernate查询的功能。 你也可以用原生SQL(native SQL)描述Hibernate查询,Hibernate...

    demo-criteria-query-rest-service

    条件查询休息服务演示依赖关系: : 选择1场HTTP GET请求: http://localhost:8080/employees ? fields=firstName 回复: [ { " firstName " : " FirstName1 " }, { " firstName " : " FirstName2 " }, { " firstName...

    exemplo-jpa-pesquisa-com-jpql-criteria:例子

    Java项目旨在提供使用JPQL查询和Criteria API的示例。 资料建模 例子: 与mappedBy联接:两个类之间的双向关系映射 延迟加载 延迟加载 FetchType EAGER 加入获取 上篮 使用SUM和AVG函数进行查询 数据访问对象(DAO...

    HQL 详解 HQL查询

    Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询...

    Multiple-Criteria-Query-Statement-Probabilities:顶点项目。 内部攻击监控系统

    基于多条件查询语句概率的数据库内部攻击监控系统 这是一个基于多条件查询语句概率的数据库内部攻击监控系统的实现,这是我硕士学位的一个顶点项目。 如果你想知道这个项目是关于什么的: :

    QBC的相关讲义和例题

    QBC的相关讲义和例题 QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。

    jQuery条件分页 代替离线查询(附代码)

    import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import ...

    JSP开发中hibernate框架的常用检索方式总结

    HQL检索:通过query接口对象查询 QBC检索:通过criteria接口对象查询 SQL检索:通过SQL语句查询  2、HQL检索方式: 查询全部数据:session.createQuery(“from 类名”); 根据条件查询:session.createQuery(...

    hibernate:一对多,多对多,一对一,乐观锁,二级缓存

    测试实现的功能: 一对一新增 一对多新增 多对多新增 多对多删除 乐观锁 一级缓存,二级缓存,读写并发 query 查询一级缓存 Criteria--基于条件查询 dao 实现测试

    支持多数据库的ORM框架ef-orm.zip

     因此,对于关系型数据库而言——Entity和Query是一体两面的事物,所谓Query,可以包含各种复杂的查询条件,甚至可以作为一个完整的SQL操作请求的描述。为此,EF彻底将Entity和Query绑在了一起。这种思想,使得...

    sql2005全文检索.doc

    @Criteria Varchar( 8000 ), --查询条件 @Sort Varchar( 255 ), --排序字符串 @FristTopNum int, --显示的第一页置顶的数目 @Page bigint OUTPUT , --显示的当前页号 @CurrentPageRowbigint, --页大小(显示...

    hibernate 教程

    条件查询(Criteria Query) 12.1. 创建一个Criteria实例 12.2. 缩小结果集范围 12.3. 对结果排序 12.4. 关联(Associations) 12.5. 动态关联对象获取(Dynamic association fetching) 12.6. ...

    hibernate

    条件查询(Criteria Query) 12.1. 创建一个Criteria实例 12.2. 缩小结果集范围 12.3. 对结果排序 12.4. 关联(Associations) 12.5. 动态关联对象获取(Dynamic association fetching) 12.6. ...

    NHibernate参考文档 2.0.0 chm

    9.3.4. 条件查询(Criteria queries) 9.3.5. 使用原生SQL的查询 9.4. 修改持久化对象 9.4.1. 使用同一个ISession持久化对象 9.4.2. 修改脱管(Detached)对象 9.4.3. 重新附脱管(Detached)对像 9.5. 删除持久化对象 9.6...

    NHibernate中文帮组文档(2008.11月更新)

    9.3.4. 条件查询(Criteria queries) 9.3.5. 使用原生SQL的查询 9.4. 修改持久化对象 9.4.1. 使用同一个ISession持久化对象 9.4.2. 修改脱管(Detached)对象 9.4.3. 重新附脱管(Detached)对像 9.5. 删除持久化对象 9.6...

    Hibernate参考文档

    10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出...

    重构_改善既有代码的设计[高清版]中文版

     Separate query from Modifier 将查询方法与修改方法分离   Parameterize Method 参数化方法   Replace Parameter with Explicit Methods 用显式方法代替参数  Preserve Whole Object 保持对象完整   ...

    重构-改善既有代码的设计+中文版

     *Replace Temp with Query 用查询方法代替临时变量   Introduce Explaining Variable 引入解释性变量   Split Temporary Variable 分离临时变量   *Remove Assignments to Parameters 去除参数赋值   ...

Global site tag (gtag.js) - Google Analytics