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

- 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类型。

- 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.)
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();
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");
- }

5、动态关联对象获取(Dynamic association fetching)
可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。
- List cats = sess.createCriteria(Cat.class)
- .add( Expression.like("name", "Fritz%") )
- .setFetchMode("mate", FetchMode.EAGER)
- .list();
这个查询会通过外连接(outer join)同时获得 mate和kittens。
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 comparisons
- List 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();
Hibernate动态条件查询(Criteria Query)的更多相关文章
- [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)
本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...
- nhibernate教程(4)--条件查询(Criteria Query)
NHibernate之旅(4):探索查询之条件查询(Criteria Query) 2008-10-16 18:20 by 李永京, 44341 阅读, 43 评论, 收藏, 编辑 本节内容 NHi ...
- [NHibernate]条件查询Criteria Query
目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...
- Hibernate QBC 条件查询(Criteria Queries) and Demos
目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...
- Hibernate的条件查询的几种方式
1. 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Session ...
- Hibernate的条件查询的几种方式+查询所有的记录
条件查询 . 第一种,用?占位符,如: //登录(用?占位符) public List<UserPO> LoginUser(UserPO up)throws Exception{ Sess ...
- NHibernate初学三之条件查询(Criteria Queries)与AspNetPager分页实例
NHibernate除了SQL与HQL两种查询操作外,还有一种就是条件查询Criteria,本文将从网上整理一些Criteria的理论及小实例,最后通过一个结合AspNetPager分页来加深理解,必 ...
- 条件查询Criteria
public User getUserByNameCri(String name){ Session session = null; User user = null; try { session = ...
- 【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询
一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables------------------------------- ...
随机推荐
- Collection接口的子接口——Set接口
https://docs.oracle.com/javase/8/docs/api/java/util/Set.html public interface Set<E> extends ...
- java实现生产者和消费者问题
Java实现生产者和消费者问题 欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti
- 北上广Java开发月薪20K往上,该如何做,需要会写什么
这个问题可能很多人会说这只是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为这方面除了北上广深杭 ...
- 13 Python之第一类对象闭包和迭代器
def fn(): print("我叫fn") fn() print(fn)## <function fn at 0x0000000001D12E18> f ...
- MySQL之RPM安装说明及配置
1.查看当前系统是否安装过Linux rpm -qa | grep -i mysql 未安装无任何输出:安装会打印对应mysql的rpm安装包. 2.准备安装包: MySQL-client-5.5.4 ...
- Delphi 变量的作用域
- 17、Nginx HTTPS 实践
1.HTTPS安全证书基本概述 为什么需要使用HTTPS, 因为HTTP不安全.当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡 ...
- PHP随机产生10个100以内互不相同的正整数按从小到大的顺序输出
<?php //产生1~100的正整数 $numbers = range(1,100); //从1~100中选出10个不重复的整数,并使用函数进行排序 $randNumbers = array_ ...
- mysql向表中某字段前后追加一段字符串 concat(), trim(), ltrim(), rtrim(), repeat()
1.mysql向表中某字段后面追加一段字符串:update table_name set field=CONCAT(field, '分隔符', str);//'分隔符',可以为空,也可以省略updat ...
- shell更改xml中的指定值
sed -i 's;<id>.*<\/id>;<id>新内容<\/id>;g' your.xml