您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 12Hibernate中Criteria的完整用法
QBE(QueryByExample)Criteriacri=session.createCriteria(Student.class);cri.add(Example.create(s));//s是一个Student对象listcri.list();实质:创建一个模版,比如我有一个表serial有一个giftortoy字段,我设置serial.setgifttoy(2),则这个表中的所有的giftortoy为2的数据都会出来2:QBC(QueryByCriteria)主要有Criteria,Criterion,Oder,Restrictions类组成session=this.getSession();Criteriacri=session.createCriteria(JdItemSerialnumber.class);Criterioncron=Restrictions.like(customer,name);cri.add(cron);list=cri.list();==============================比较运算符HQL运算符QBC运算符含义=Restrictions.eq()等于Restrictions.not(Exprission.eq())不等于Restrictions.gt()大于=Restrictions.ge()大于等于Restrictions.lt()小于=Restrictions.le()小于等于isnullRestrictions.isnull()等于空值isnotnullRestrictions.isNotNull()非空值likeRestrictions.like()字符串模式匹配andRestrictions.and()逻辑与andRestrictions.conjunction()逻辑与orRestrictions.or()逻辑或orRestrictions.disjunction()逻辑或notRestrictions.not()逻辑非in(列表)Restrictions.in()等于列表中的某一个值ontin(列表)Restrictions.not(Restrictions.in())不等于列表中任意一个值betweenxandyRestrictions.between()闭区间xy中的任意值notbetweenxandyRestrictions.not(Restrictions..between())小于值X或者大于值y3:HQLStringhql=selects.name,avg(s.age)fromStudentsgroupbys.name;Queryquery=session.createQuery(hql);list=query.list();....4:本地SQL查询session=sessionFactory.openSession();tran=session.beginTransaction();SQLQuerysq=session.createSQLQuery(sql);sq.addEntity(Student.class);list=sq.list();tran.commit();16.1.创建一个Criteria实例org.hibernate.Criteria接口表示特定持久类的一个查询。Session是Criteria实例的工厂。Criteriacrit=sess.createCriteria(Cat.class);crit.setMaxResults(50);Listcats=crit.list();16.2.限制结果集内容一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。Listcats=sess.createCriteria(Cat.class).add(Restrictions.like(name,Fritz%)).add(Restrictions.between(weight,minWeight,maxWeight)).list();约束可以按逻辑分组。Listcats=sess.createCriteria(Cat.class).add(Restrictions.like(name,Fritz%)).add(Restrictions.or(Restrictions.eq(age,newInteger(0)),Restrictions.isNull(age))).list();Listcats=sess.createCriteria(Cat.class).add(Restrictions.in(name,newString[]{Fritz,Izi,Pk})).add(Restrictions.disjunction().add(Restrictions.isNull(age)).add(Restrictions.eq(age,newInteger(0))).add(Restrictions.eq(age,newInteger(1))).add(Restrictions.eq(age,newInteger(2))))).list();Hibernate提供了相当多的内置criterion类型(Restrictions子类),但是尤其有用的是可以允许你直接使用SQL。Listcats=sess.createCriteria(Cat.class).add(Restrictions.sql(lower({alias}.name)likelower(?),Fritz%,Hibernate.STRING)).list();{alias}占位符应当被替换为被查询实体的列别名。Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()创建一个Property。Propertyage=Property.forName(age);Listcats=sess.createCriteria(Cat.class).add(Restrictions.disjunction().add(age.isNull()).add(age.eq(newInteger(0))).add(age.eq(newInteger(1))).add(age.eq(newInteger(2))))).add(Property.forName(name).in(newString[]{Fritz,Izi,Pk})).list();16.3.结果集排序你可以使用org.hibernate.criterion.Order来为查询结果排序。Listcats=sess.createCriteria(Cat.class).add(Restrictions.like(name,F%).addOrder(Order.asc(name)).addOrder(Order.desc(age)).setMaxResults(50).list();Listcats=sess.createCriteria(Cat.class).add(Property.forName(name).like(F%)).addOrder(Property.forName(name).asc()).addOrder(Property.forName(age).desc()).setMaxResults(50).list();16.4.关联你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。Listcats=sess.createCriteria(Cat.class).add(Restrictions.like(name,F%).createCriteria(kittens).add(Restrictions.like(name,F%).list();注意第二个createCriteria()返回一个新的Criteria实例,该实例引用kittens集合中的元素。接下来,替换形态在某些情况下也是很有用的。Listcats=sess.createCriteria(Cat.class).createAlias(kittens,kt).createAlias(mate,mt).add(Restrictions.eqProperty(kt.name,mt.name)).list();(createAlias()并不创建一个新的Criteria实例。)Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的。如果你希望只获得符合条件的kittens,你必须使用returnMaps()。Listcats=sess.createCriteria(Cat.class).createCriteria(kittens,kt).add(Restrictions.eq(name,F%)).returnMaps().list();Iteratoriter=cats.iterator();while(iter.hasNext()){Mapmap=(Map)iter.next();Catcat=(Cat)map.get(Criteria.ROOT_ALIAS);Catkitten=(Cat)map.get(kt);}16.5.动态关联抓取你可以使用setFetchMode()在运行时定义动态关联抓取的语义。Listcats=sess.createCriteria(Cat.class).add(Restrictions.like(name,Fritz%)).setFetchMode(mate,FetchMode.EAGER).setFetchMode(kittens,FetchMode.EAGER).list();这个查询可以通过外连接抓取mate和kittens。查看第20.1节“抓取策略(Fetchingstrategies)”可以获得更多信息。16.6.查询示例org.hibernate.criterion.Example类允许你通过一个给定实例构建一个条件查询。Catcat=newCat();cat.setSex('F');cat.setColor(Color.BLACK);Listresults=session.createCriteria(Cat.class).add(Example.create(cat)).list();版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。你可以自行调整Example使之更实用。Exampleexample=Example.create(cat).excludeZeroes()//excludezerovaluedproperties.excludeProperty(color)//excludethepropertynamedcolor.ignoreCase()//performcaseinsensitivestringcomparisons.enableLike();//uselikeforstringcomparisonsListresults=session.createCriteria(Cat.class).add(example).list();你甚至可以使用examples在关联对象上放置条件。Listresults=session.createCriteria(Cat.class).add(Example.create(cat)).createCriteria(mate).add(Example.create(cat.getMate())).list();16.7.投影(Projections)、聚合(aggregation)和分组(grouping)org.hibernate.criterion.
本文标题:12Hibernate中Criteria的完整用法
链接地址:https://www.777doc.com/doc-4375465 .html