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

  1. Criteria crit = sess.createCriteria(Cat.class);
    crit.setMaxResults(50); List cats = crit.list();

2、缩小结果集范围
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。

  1.  
  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.like("name", "Fritz%") )
  3. .add( Expression.between("weight", minWeight, maxWeight) )
  4. .list();

表达式(Expressions)可以按照逻辑分组.

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.like("name", "Fritz%") )
  3. .add( Expression.or(
  4. Expression.eq( "age", new Integer(0) ),
  5. Expression.isNull("age")
  6. ) )
  7. .list();
  8. List cats = sess.createCriteria(Cat.class)
  9. .add( Expression.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
  10. .add( Expression.disjunction()
  11. .add( Expression.isNull("age") )
  12. .add( Expression.eq("age", new Integer(0) ) )
  13. .add( Expression.eq("age", new Integer(1) ) )
  14. .add( Expression.eq("age", new Integer(2) ) )
  15. ) )
  16. .list();

有很多预制的条件类型(Expression的子类)。有一个特别有用,可以让你直接嵌入SQL。

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING) )
  3. .list();

其中的{alias}是一个占位符,它将会被所查询实体的行别名所替代。(原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)

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

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.like("name", "F%")
  3. .addOrder( Order.asc("name") )
  4. .addOrder( Order.desc("age") )
  5. .setMaxResults(50)
  6. .list();

4、关联(Associations)
你可以在关联之间使用createCriteria(),很容易地在存在关系的实体之间指定约束。

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.like("name", "F%")
  3. .createCriteria("kittens")
  4. .add( Expression.like("name", "F%")
  5. .list();

注意,第二个createCriteria()返回一个Criteria的新实例,指向kittens集合类的元素。

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

  1. List cats = sess.createCriteria(Cat.class)
  2. .createAlias("kittens", "kt")
  3. .createAlias("mate", "mt")
  4. .add( Expression.eqProperty("kt.name", "mt.name") )
  5. .list();

(createAlias())并不会创建一个Criteria的新实例。)

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

  1. List cats = sess.createCriteria(Cat.class)
  2. .createCriteria("kittens", "kt")
  3. .add( Expression.eq("name", "F%") )
  4. .returnMaps()
  5. .list();
  6. Iterator iter = cats.iterator();
  7. while ( iter.hasNext() ) {
  8. Map map = (Map) iter.next();
  9. Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
  10. Cat kitten = (Cat) map.get("kt");
  11. }

5、动态关联对象获取(Dynamic association fetching)
可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。

  1. List cats = sess.createCriteria(Cat.class)
  2. .add( Expression.like("name", "Fritz%") )
  3. .setFetchMode("mate", FetchMode.EAGER)
  4. .list();

这个查询会通过外连接(outer join)同时获得 mate和kittens。

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

  1. Cat cat = new Cat();
  2. cat.setSex('F');
  3. cat.setColor(Color.BLACK);
  4. List results = session.createCriteria(Cat.class)
  5. .add( Example.create(cat) )
  6. .list();

版本属性,表示符属性和关联都会被忽略。默认情况下,null值的属性也被排除在外。

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

  1. Example example = Example.create(cat)
  2. .excludeZeroes() //exclude zero valued properties
  3. .excludeProperty("color") //exclude the property named "color"
  4. .ignoreCase() //perform case insensitive string comparisons
  5. .enableLike(); //use like for string comparisons
  6. List results = session.createCriteria(Cat.class)
  7. .add(example)
  8. .list();

你甚至可以用示例对关联对象建立criteria。

  1. List results = session.createCriteria(Cat.class)
  2. .add( Example.create(cat) )
  3. .createCriteria("mate")
  4. .add( Example.create( cat.getMate() ) )
  5. .list();

Hibernate动态条件查询(Criteria Query)的更多相关文章

  1. [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)

    本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...

  2. nhibernate教程(4)--条件查询(Criteria Query)

    NHibernate之旅(4):探索查询之条件查询(Criteria Query) 2008-10-16 18:20 by 李永京, 44341 阅读, 43 评论, 收藏,  编辑 本节内容 NHi ...

  3. [NHibernate]条件查询Criteria Query

    目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...

  4. Hibernate QBC 条件查询(Criteria Queries) and Demos

    目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...

  5. Hibernate的条件查询的几种方式

    1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session ...

  6. Hibernate的条件查询的几种方式+查询所有的记录

    条件查询 . 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Sess ...

  7. NHibernate初学三之条件查询(Criteria Queries)与AspNetPager分页实例

    NHibernate除了SQL与HQL两种查询操作外,还有一种就是条件查询Criteria,本文将从网上整理一些Criteria的理论及小实例,最后通过一个结合AspNetPager分页来加深理解,必 ...

  8. 条件查询Criteria

    public User getUserByNameCri(String name){ Session session = null; User user = null; try { session = ...

  9. 【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

    一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables------------------------------- ...

随机推荐

  1. Python-RabbitMQ-direct(广播模式)

    direct绑定模式的,选择性接收 生产者:direct_publiser.py import pika,sys connection = pika.BlockingConnection(pika.C ...

  2. Wannafly挑战赛19:C. 多彩的树

    传送门 $k$的范围非常小, $O(n2^k)$求出状态最多为$S$的路径数, 然后容斥. #include <iostream> #include <sstream> #in ...

  3. Mysql学习(二)之安装、开启自启、启动、重启、停止

    安装 方法一:通过homebrew brew install mysql 方法二:通过官网dmg文件安装(Mac) https://dev.mysql.com/downloads/mysql/ 通过h ...

  4. Java版本及历史简述

    Java版本及历史简述 初学Java,对于Java那么多版本很困惑,这里做一点笔记,如有错误希望指出. Java由Sun公司创造,后Sun公司被Oracle公司收购,Java也随之变为Oracle的产 ...

  5. with as 语句

    with就是一个sql片段,供后面的sql语句引用. 详情参见:https://www.cnblogs.com/Niko12230/p/5945133.html

  6. todo 看看堆栈里的东西

    类变量,成员变量,静态方法里的变量.参数,成员方法里的变量,参数

  7. 多线程的些许理解(平台x86,具体考虑linux,windows)

    多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...

  8. oracle存储过程临时表

    接到一个以前领导的需求,说的大概意思是: 如果能关联上就取关联上的最大值更新到表里,没有关联上的就取原来的值. 写一个存储过程,这正好用到了临时表,上网查询,用的太乱了,特别记录. 准备阶段 创建PD ...

  9. rabbitmq一键部署脚本

    1.新建一个名字叫 auto_install_rabbitmq.sh  的文件 2.将下面脚本拷贝到文件中,具体操作步骤在注释里面 #环境 linux #一键安装rabitmq,在linux环境中使用 ...

  10. Linux系统下C语言获取Time

    获取时间的函数有很多,具体包括如下: time()/gettimeofday()等等,下面是获取具体到usecond的时间程序: #include <iostream> #include ...