您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Criteria用法详解
hibernate:Hibernate中Criteria的完整使用方法疯狂代码ĵ:http:/ 最近在项目中使用Spring和Hibernate进行开发有感于Criteria比较好用在查询思路方法设计上可以灵活根据Criteria特点来方便地进行查询条件组装现在对HibernateCriteria使用方法进行整理总结: Hibernate设计了CriteriaSpecication作为Criteria父接口下面提供了Criteria和DetachedCriteria Criteria和DetachedCriteria主要区别在于创建形式不样Criteria是在线所以它是由HibernateSession进行创建;而DetachedCriteria是离线创建时无需SessionDetachedCriteria提供了2个静态思路方法forClass(Class)或forEntityName(Name)进行DetachedCriteria例子创建Spring框架提供了getHibernateTemplate.findByCriteria(detachedCriteria)思路方法可以很方便地根据DetachedCriteria来返回查询结果 Criteria和DetachedCriteria均可使用Criterion和Projection设置查询条件可以设置FetchMode(联合查询抓取模式)设置排序方式对于Criteria还可以设置FlushModel(冲刷Session方式)和LockMode(数据库锁模式) 下面对Criterion和Projection进行详细介绍说明 Criterion是Criteria查询条件Criteria提供了add(Criterioncriterion)思路方法来添加查询条件 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)即根据个对象(实际使用中般是映射到数据库对象)来创建然后可以设置些过滤条件: ExampleexampleUser=Example.create(u) .ignoreCase//忽略大小写 .enableLike(MatchMode.ANYWHERE); //对String类型属性无论在那里值在那里都匹配相当于%value%Project主要是让Criteria能够进行报表查询并可以实现分组Project主要有SimpleProjection、ProjectionList和Property3个实现其中SimpleProjection和ProjectionList例子化是由内建Projections来完成如提供avg、count、max、min、sum可以让开发者很容易对某个字段进行统计查询 Property是对某个字段进行查询条件设置如通过Porperty.forName(“color”).in(String{“black”,”red”,”write”});则可以创建个Project例子通过criteriaadd(Project)思路方法加入到查询条件中去 使用Criteria进行查询主要要清晰是Hibernate提供了那些类和思路方法来满足开发中查询条件创建和组装下面介绍几种使用方法: 1.创建个Criteria例子 org.hibernate.Criteria接口表示特定持久类个查询Session是Criteria例子工厂Criteriacrit=sess.createCriteria(Cat.);crit.MaxResults(50);Listcats=crit.list; 2.限制结果集内容 个单独查询条件是org.hibernate.criterion.Criterion接口个例子 org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型工厂思路方法Listcats=sess.createCriteria(Cat.) .add(Restrictions.like(name,Fritz%)) .add(Restrictions.between(weight,minWeight,maxWeight)) .list; 约束可以按逻辑分组Listcats=sess.createCriteria(Cat.) .add(Restrictions.like(name,Fritz%)) .add(Restrictions.or( Restrictions.eq(age,Integer(0)), Restrictions.isNull(age) )) .list;Listcats=sess.createCriteria(Cat.) .add(Restrictions.in(name,String{Fritz,Izi,Pk})) .add(Restrictions.disjunction .add(Restrictions.isNull(age)) .add(Restrictions.eq(age,Integer(0))) .add(Restrictions.eq(age,Integer(1))) .add(Restrictions.eq(age,Integer(2))) )) .list; Hibernate提供了相当多内置criterion类型(Restrictions子类),但是尤其有用是可以允许你直接使用SQLListcats=sess.createCriteria(Cat.) .add(Restrictions.sql(lower({alias}.name)likelower(?),Fritz%,Hibernate.STRING)) .list; {alias}占位符应当被替换为被查询实体列别名 Property例子是获得个条件另外种途径你可以通过Property.forName创建个PropertyPropertyage=Property.forName(age);Listcats=sess.createCriteria(Cat.) .add(Restrictions.disjunction .add(age.isNull) .add(age.eq(Integer(0))) .add(age.eq(Integer(1))) .add(age.eq(Integer(2))) )) .add(Property.forName(name).in(String{Fritz,Izi,Pk})) .list; 3.结果集排序 你可以使用org.hibernate.criterion.Order来为查询结果排序Listcats=sess.createCriteria(Cat.) .add(Restrictions.like(name,F%) .addOrder(Order.asc(name)) .addOrder(Order.desc(age)) .MaxResults(50) .list;Listcats=sess.createCriteria(Cat.) .add(Property.forName(name).like(F%)) .addOrder(Property.forName(name).asc) .addOrder(Property.forName(age).desc) .MaxResults(50) .list; 4.关联 你可以使用createCriteria非常容易在互相关联实体间建立约束Listcats=sess.createCriteria(Cat.) .add(Restrictions.like(name,F%) .createCriteria(kittens) .add(Restrictions.like(name,F%) .list; 注意第2个createCriteria返回个新Criteria例子该例子引用kittens集合中元素接下来替换形态在某些情况下也是很有用Listcats=sess.createCriteria(Cat.) .createAlias(kittens,kt) .createAlias(mate,mt) .add(Restrictions.eqProperty(kt.name,mt.name)) .list; (createAlias并不创建个新Criteria例子) Cat例子所保存的前两次查询所返回kittens集合是没有被条件预过滤如果你希望只获得符合条件kittens你必须使用MapsListcats=sess.createCriteria(Cat.) .createCriteria(kittens,kt) .add(Restrictions.eq(name,F%)) .Maps .list;Iteratoriter=cats.iterator;while(iter.hasNext){ Mapmap=(Map)iter.next; Catcat=(Cat)map.get(Criteria.ROOT_ALIAS); Catkitten=(Cat)map.get(kt);} 5.动态关联抓取 你可以使用FetchMode在运行时定义动态关联抓取语义Listcats=sess.createCriteria(Cat.) .add(Restrictions.like(name,Fritz%)) .FetchMode(mate,FetchMode.EAGER) .FetchMode(kittens,FetchMode.EAGER) .list; 这个查询可以通过外连接抓取mate和kittens 6.查询举例 org.hibernate.criterion.Example类允许你通过个给定例子构建个条件查询Catcat=Cat;cat.Sex('F');cat.Color(Color.BLACK);Listresults=session.createCriteria(Cat.) .add(Example.create(cat)) .list; 版本属性、标识符和关联被忽略默认情况下值为null属性将被排除 可以自行调整Example使的更实用Exampleexample=Example.create(cat) .excludeZeroes //excludezerovaluedproperties .excludeProperty(color)//excludethepropertynamedcolor .ignoreCase //performinsensitivecomparisons .enableLike; //uselikeforcomparison
本文标题:Criteria用法详解
链接地址:https://www.777doc.com/doc-6345171 .html