Hibernate查询之Criteria查询

转自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html

Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。 
  Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。 
  Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 AND 和 OR 操作符进行来联结查询条件集合。 
  Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件(SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 conjunction 和disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合。 
  Example 的创建有所不同, Example 本身提供了一个静态方法 create(Objectentity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件: 
  Example exampleUser =Example.create(u) 
  .ignoreCase() // 忽略大小写 
  .enableLike(MatchMode.ANYWHERE); // 对 String 类型的属性,无论在那里值在那里都匹配。相当于 %value% 
  Project 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Project 主要有SimpleProjection 、ProjectionList 和 Property 三个实现。其中SimpleProjection 和ProjectionList 的实例化是由内建的Projections 来完成,如提供的 avg 、count 、max 、min 、sum 可以让开发者很容易对某个字段进行统计查询。 
  Property 是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”). in(new String[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过criteria 的 add(Project) 方法加入到查询条件中去。

1. 创建一个Criteria 实例
  org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。 
  Criteria crit = sess.createCriteria(Cat.class); 
  crit.setMaxResults(50); 
  List cats = crit.list();
2. 限制结果集内容
  一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。 
  org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.like("name", "Fritz%") ) 
  .add( Restrictions.between("weight", minWeight, maxWeight) ) 
  .list(); 
  约束可以按逻辑分组。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.like("name", "Fritz%") ) 
  .add( Restrictions.or( 
  Restrictions.eq( "age", new Integer(0) ), 
  Restrictions.isNull("age") 
  ) ) 
  .list(); 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions. in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) 
  .add( Restrictions.disjunction() 
  .add( Restrictions.isNull("age") ) 
  .add( Restrictions.eq("age", new Integer(0) ) ) 
  .add( Restrictions.eq("age", new Integer(1) ) ) 
  .add( Restrictions.eq("age", new Integer(2) ) ) 
  ) ) 
  .list(); 
  Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", 
  Hibernate.STRING) ) 
  .list(); 
  {alias}占位符应当被替换为被查询实体的列别名。 
  Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个 
  Property。 
  Property age = Property.forName("age"); 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.disjunction() 
  .add( age.isNull() ) 
  .add( age.eq( new Integer(0) ) ) 
  .add( age.eq( new Integer(1) ) ) 
  .add( age.eq( new Integer(2) ) ) 
  ) ) 
  .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) 
  .list();
3. 结果集排序
  可以使用org.hibernate.criterion.Order来为查询结果排序。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.like("name", "F%") 
  .addOrder( Order.asc("name") ) 
  .addOrder( Order.desc("age") ) 
  .setMaxResults(50) 
  .list(); 
  List cats = sess.createCriteria(Cat.class) 
  .add( Property.forName("name").like("F%") ) 
  .addOrder( Property.forName("name").asc() ) 
  .addOrder( Property.forName("age").desc() ) 
  .setMaxResults(50) 
  .list();
4. 关联
  你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.like("name", "F%") 
  .createCriteria("kittens") 
  .add( Restrictions.like("name", "F%") 
  .list(); 
  注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。 
  接下来,替换形态在某些情况下也是很有用的。 
  List cats = sess.createCriteria(Cat.class) 
  .createAlias("kittens", "kt") 
  .createAlias("mate", "mt") 
  .add( Restrictions.eqProperty("kt. name", "mt. name") ) 
  .list(); 
  (createAlias()并不创建一个新的 Criteria实例。) 
  Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得 
  符合条件的kittens, 你必须使用returnMaps()。 
  List cats = sess.createCriteria(Cat.class) 
  .createCriteria("kittens", "kt") 
  .add( Restrictions.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. 动态关联抓取
  你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 
  List cats = sess.createCriteria(Cat.class) 
  .add( Restrictions.like("name", "Fritz%") ) 
  .setFetchMode("mate", FetchMode.EAGER) 
  .setFetchMode("kittens", FetchMode.EAGER) 
  .list(); 
  这个查询可以通过外连接抓取mate和kittens。
6. 查询示例
  org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。 
  Cat cat = new Cat(); 
  cat.setSex('F'); 
  cat.setColor(Color.BLACK); 
  List results = session.createCriteria(Cat.class) 
  .add( Example.create(cat) ) 
  .list(); 
  版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 
  可以自行调整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(); 
  甚至可以使用examples在关联对象上放置条件。 
  List results = session.createCriteria(Cat.class) 
  .add( Example.create(cat) ) 
  .createCriteria("mate") 
  .add( Example.create( cat.getMate() ) ) 
  .list();
7. 投影、聚合和分组
  org.hibernate.criterion.Projections是 Projection 的实例工厂。通过调用 setProjection()应用投影到一个查询。 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.rowCount() ) 
  .add( Restrictions.eq("color", Color.BLACK) ) 
  .list(); 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.projectionList() 
  .add( Projections.rowCount() ) 
  .add( Projections.avg("weight") ) 
  .add( Projections.max("weight") ) 
  .add( Projections.groupProperty("color") ) 
  ) 
  .list(); 
  ?? 
  在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。 
  实现方式: 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) 
  .addOrder( Order.asc("colr") ) 
  .list();? 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.groupProperty("color").as("colr") ) 
  .addOrder( Order.asc("colr") ) 
  .list(); 
  alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当添加一个投影到一个投影列表中时 你可以为它指定一个别名: 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.projectionList() 
  .add( Projections.rowCount(), "catCountByColor" ) 
  .add( Projections.avg("weight"), "avgWeight" ) 
  .add( Projections.max("weight"), "maxWeight" ) 
  .add( Projections.groupProperty("color"), "color" ) 
  ) 
  .addOrder( Order.desc("catCountByColor") ) 
  .addOrder( Order.desc("avgWeight") ) 
  .list(); 
  List results = session.createCriteria(Domestic.class, "cat") 
  .createAlias("kittens", "kit") 
  .setProjection( Projections.projectionList() 
  .add( Projections.property("cat. name"), "catName" ) 
  .add( Projections.property("kit. name"), "kitName" ) 
  ) 
  .addOrder( Order.asc("catName") ) 
  .addOrder( Order.asc("kitName") ) 
  .list(); 
  也可以使用Property.forName()来表示投影: 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Property.forName("name") ) 
  .add( Property.forName("color").eq(Color.BLACK) ) 
  .list(); 
  List results = session.createCriteria(Cat.class) 
  .setProjection( Projections.projectionList() 
  .add( Projections.rowCount().as("catCountByColor") ) 
  .add( Property.forName("weight").avg().as("avgWeight") ) 
  .add( Property.forName("weight").max().as("maxWeight") ) 
  .add( Property.forName("color").group().as("color" ) 
  ) 
  .addOrder( Order.desc("catCountByColor") ) 
  .addOrder( Order.desc("avgWeight") ) 
  .list();
8. 离线(detached)查询和子查询
  DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。 
  DetachedCriteria query = DetachedCriteria.forClass(Cat.class) 
  .add( Property.forName("sex").eq('F') ); 
  //创建一个Session 
  Session session = .; 
  Transaction txn = session.beginTransaction(); 
  List results = query.getExecutableCriteria(session).setMaxResults(100).list(); 
  txn.commit(); 
  session.close(); 
  DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者 
  Property获得。 
  DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class) 
  .setProjection( Property.forName("weight").avg() ); 
  session.createCriteria(Cat.class) 
  .add( Property.forName("weight).gt(avgWeight) ) 
  .list(); 
  DetachedCriteria weights = DetachedCriteria.forClass(Cat.class) 
  .setProjection( Property.forName("weight") ); 
  session.createCriteria(Cat.class) 
  .add( Subqueries.geAll("weight", weights) ) 
  .list(); 
  相互关联的子查询也是有可能的: 
  DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2") 
  .setProjection( Property.forName("weight").avg() ) 
  .add( Property.forName("cat2.sex").eqProperty("cat.sex") ); 
  session.createCriteria(Cat.class, "cat") 
  .add( Property.forName("weight).gt(avgWeightForSex) ) 
  .list(); 

转载于:https://www.cnblogs.com/marcotan/p/4256931.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ Idea 常用插件

必备插件 Lombok 使用此插件可以使得我们的代码简洁,不用去写很多的set/get方法。使用之前需要引入 lombok 插件依赖。 JsonFormat 基于GsonFormat。快速将JSON字符串转换为实体类。它支持Jackson注释。 MyBatis Log Plugin 将 SQL 直接打印在控制台,不用…

jQuery 学习笔记(jQuery: The Return Flight)

第一课. ajax:$.ajax(url[, settings]) 练习代码: $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

Redis Hash 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Redis set 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web应用中使用注解缓存,其实很简单&#xff0…

Redis String 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

于我,过去,现在和未来 —— 西格里夫·萨松

In me, past, present, future meet            于我,过去、现在和未来To hold long chiding conference              商讨聚会 各执一词 纷扰不息My lusts usurp the present tense             林林总总的 欲望,…

Java assert关键字

Java assert关键字 Assert 简介 Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion)。语法格式有两种: assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为…

linux 二级域名设置

首先,你的拥有一个有泛域名解析的顶级域名,例如: domain.com  其次,在 httpd.conf 中打开 mod_rewrite  之后,在 httpd.conf 的最后,添加以下内容:  RewriteEngine on  RewriteMap lowe…

Spring Boot @Conditional 注解

Spring Boot Conditional注解 Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean。 Conditional注解定义 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documente…

计算几何 半平面交

LA 4992 && hdu 3761 Jungle Outpost 杭电的有点坑啊。。一直爆内存,后来发现大白的半平面交模板那里 point *p new point[n]; line *q new line[n]这里出了问题,应该是在函数里面申请不了比较大的数组,所以爆内存。。我在全局定义…

Maven 强制导入jar包

场景 有时候因为各种原因(依赖有了,jar包有了),项目中就是没有这个jar包。 在需要强导的项目中创建lib文件夹,将需要强导的jar包访问lib中。添加依赖${pom.basedir}:获取当前所在的项目目录 ${pom.basedir&…

0910

我累得时候希望你能在我身边,在你的怀里好好的睡一觉。转载于:https://www.cnblogs.com/zhanzhao/p/3964175.html

《Java 高并发》03 线程的生命周期

相关概念 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。 一个进程是一个独立的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含…

OpenLayers3 online build

openlayers3使用了一个比较复杂的build工具,从github上下载下来的代码中并没有build之后的版本,要配置build环境又比较繁琐,好在官方的example中提供了在线的版本,下面就是link: http://openlayers.org/en/v3.0.0/buil…

Mysql 必知必会(一)

文章案例所需的SQL文件,点击下载 使用MySQL 进入mysql安装目录下的bin目录: 连接Mysql:mysql -uroot -p123456;显示Mysql下的所有数据库:show databases;切换数据库:use local;显示数据库下所有表名:show t…

design.js

//模块式开发 var myNamespace (function () { var myPrivateVar 0;var myPrivateMethod function (foo) {console.log(foo); };return {myPublicVar : "foo",myPublicFunction : function (bar) {myPrivateVar;myPrivateMethod(bar);} }; })(); //原型模式 var…

Spring boot 整合dynamic实现多数据源

项目git地址:Jacob-dynamic 准备工作 # 创建数据库db1 CREATE DATABASE db1CHARACTER SET utf8 COLLATE utf8_bin # 创建user表 CREATE TABLE user (id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 # 添加数据 INSERT…

LInux 命令大全

开关机 reboot:重启shutdown -h 0 或者init 0 :关机halt:关机poweroff:关机 文件的操作 ll:显示文件夹详细信息ls:显示文件目录mkdir fileName:创建目录mkdir -p fileName/fileName:目录cd file…

企业级业务系统开发实战-序言

前些年一直在做微软的解决方案实施与软件开发的工作。在学习、项目实施、开发与管理的过程中学到了别人不少好的东西,也自身总结了大量的经验,希望能够通过一个系列来跟大家分享关于软件开发方面的内容。 这个开发系列的由来是这样的,两年前作…