




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象。简单来讲,Criteria Query可以看作是传统SQL的对象化表示,如: Criteria criteria = session.createCriteria(User.class); criteria.add(Expression.eq(name,Erica); criteria.add(Expression.eq(sex,new Integer(1); Criteria 查询表达式 Criteria 本身只是一个查询容器,具体的查询条件需要通过Criteria.add方法添加到Criteria实例中。 如前例所示,Expression 对象具体描述了查询条件。针对SQL 语法,Expression提供了对应的查询限定机制,包括: 方法 描述 Expression.eq 对应SQL“field = value”表达式。 如Expression.eq(name,Erica) Expression.allEq 参数为一个Map对象,其中包含了多个属性值对应关系。相当于多个Expression.eq关系的叠加。 Expression.gt 对应SQL中的 “field value ” 表达式 Expression.ge 对应SQL中的 “field = value” 表达式 Expression.lt 对应SQL中的 “field value” 表达式 Expression.le 对应SQL中的 “field field”。 Expression.geProperty 用于比较两个属性之间的值,对应SQL中的“field = field”。 Expression.ltProperty 用于比较两个属性之间的值,对应SQL中的“field field”。 Expression.leProperty 用于比较两个属性之间的值,对应SQL中的“field Restrictions.ge大於等於 =Restrictions.lt小於 Restrictions.le小於等於 =Restrictions.between對應SQL的BETWEEN子句Restrictions.like對應SQL的LIKE子句Restrictions.in對應SQL的in子句Restrictions.andand關係Restrictions.oror關係Restrictions.sqlRestrictionSQL限定查詢使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装,下面介绍几种用法: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();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(, ) ).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() 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();(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 comparisonsList 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. 投影(Projections)、聚合(aggregation)和分组(grouping)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( PjectionList().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( PjectionList().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( PjectionList().add( Pperty(), catName ).add( Pperty(), 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( PjectionList().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) );/创建一个SessionSession session = .;Transaction txn = session.beginTransaction();List results = query.getExecutableCriter
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售团队出差费用报销及市场拓展合同
- 个人艺术收藏借款合同范本
- 民政殡葬专业考试题及答案
- 孤独症康复专业试题及答案
- 医师专业面试题及答案
- 转专业考试语言试题及答案
- 社交媒体医械信任度提升-洞察及研究
- 木材加工技术革新与政策法规应对策略-洞察及研究
- 2025至2030中央商务区行业产业运行态势及投资规划深度研究报告
- 2025至2030中国湿喷混凝土机行业运营态势与投资前景调查研究报告
- 1.2 连续分类(课件)数学青岛版二年级上册(新教材)
- 8000字法律毕业论文
- 2025年哈尔滨市呼兰区人民法院公开招聘聘用制书记员、辅警、文员4人考试参考试题及答案解析
- 【2025年】蚌埠市12345政务服务便民热线岗位招聘20名考试笔试试题(含答案)
- 反诈知识竞赛试题及答案
- 钢筋加工棚租赁合同范本
- 眼整形课件教学课件
- 公司法务知识培训会课件
- 2025-2026学年秋季第一学期学校德育工作安排表
- 2025年全面质量管理知识竞赛题库及参考答案
- 医药行业KA经理工作汇报
评论
0/150
提交评论