永发信息网

mybaties中一个方法怎么使用两次criteria.and方法

答案:2  悬赏:0  手机版
解决时间 2021-02-10 02:17
mybaties中一个方法怎么使用两次criteria.and方法
最佳答案
ries set us thinking, wondering what we sho
全部回答
最近在项目中使用spring和hibernate进行开发,有感于criteria比较好用,在查询方法 设计上可以灵活的根据criteria的特点来方便地进行查询条件的组装。现在对hibernate的criteria的用法进行总结: hibernate设计了criteriaspecification作为criteria的父接口,下面提供了criteria和detachedcriteria。 criteria和detachedcriteria的主要区别在于创建的形式不一样,criteria是在线的,所 以它是由hibernatesession进行创建的;而detachedcriteria是离线的,创建时无需 session,detachedcriteria提供了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(object entity),即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些 过滤条件: exampleexampleuser=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 (newstring[]{“black”,”red”,”write”});则可以创建一个project实例。通过 criteria的add(project)方法加入到查询条件中去。 使用criteria进行查询,主要要清晰的是hibernate提供了那些类和方法来满足开发中查 询条件的创建和组装,下面介绍几种用法: 1.创建一个criteria实例 org.hibernate.criteria接口表示特定持久类的一个查询。session是criteria实例的工厂。 criteriacrit=sess.createcriteria(cat.class); crit.setmaxresults(50); listcats=crit.list(); 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(); 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(); 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"); } 5.动态关联抓取 你可以使用setfetchmode()在运行时定义动态关联抓取的语义。 listcats=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类允许你通过一个给定实例构建一个条件查询。 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")//excludethepropertynamed"color" .ignorecase()//performcaseinsensitivestringcomparisons .enablelike();//uselikeforstringcomparisons listresults=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(); 7.投影(projections)、聚合(aggregation)和分组(grouping) org.hibernate.criterion.projections是projection的实例工厂。我们通过调用 setprojection()应用投影到一个查询。 listresults=session.createcriteria(cat.class) .setprojection(projections.rowcount()) .add(restrictions.eq("color",color.black)) .list(); listresults=session.createcriteria(cat.class) .setprojection(projections.projectionlist() .add(projections.rowcount()) .add(projections.avg("weight")) .add(projections.max("weight")) .add(projections.groupproperty("color")) ) .list(); 在一个条件查询中没有必要显式的使用"groupby"。某些投影类型就是被定义为分组投影,他 们也出现在sql的groupby子句中。 可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的 实现方式: listresults=session.createcriteria(cat.class) .setprojection(projections.alias(projections.groupproperty("color"),"colr")) .addorder(order.asc("colr")) .list(); listresults=session.createcriteria(cat.class) .setprojection(projections.groupproperty("color").as("colr")) .addorder(order.asc("colr")) .list(); alias()和as()方法简便的将一个投影实例包装到另外一个别名的projection实例中。简而言之, 当你添加一个投影到一个投影列表中时你可以为它指定一个别名: listresults=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(); listresults=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()来表示投影: listresults=session.createcriteria(cat.class) .setprojection(property.forname("name")) .add(property.forname("color").eq(color.black)) .list(); listresults=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来 执行它。 detachedcriteriaquery=detachedcriteria.forclass(cat.class) .add(property.forname("sex").eq('f')); //创建一个session sessionsession=.; transactiontxn=session.begintransaction(); listresults=query.getexecutablecriteria(session).setmaxresults(100).list(); txn.commit(); session.close(); detachedcriteria也可以用以表示子查询。条件实例包含子查询可以通过subqueries或者 property获得。 detachedcriteriaavgweight=detachedcriteria.forclass(cat.class) .setprojection(property.forname("weight").avg()); session.createcriteria(cat.class) .add(property.forname("weight).gt(avgweight)) .list(); detachedcriteriaweights=detachedcriteria.forclass(cat.class) .setprojection(property.forname("weight")); session.createcriteria(cat.class) .add(subqueries.geall("weight",weights)) .list(); 相互关联的子查询也是有可能的: detachedcriteriaavgweightforsex=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();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
重庆到保定的动车车票要多少钱
美时美刻形象沙龙地址在哪,我要去那里办事
高手帮算算术题,帮我算算啦爸爸把3000元存入
合信金新花园北门在哪里啊,我有事要去这个地
细胞周期的分裂期中有rna的合成吗
cmaj9和弦指弹不够按怎么办
【秦兵马俑资料】...并结合所学知识指出秦始
竹子怎么繁殖?
重命名文件在键盘上是CTRL+什么啊?拜托了各位
广汽三菱圣道店在什么地方啊,我要过去处理事
为什么港剧韩剧台剧的国语配音的声调不同?
手机月开通黄钻,下个月系统会自动在帮你开吗
黑头地址有知道的么?有点事想过去
“隽语”到底是指什么语?是自相矛盾的语言吗
逐渐、茂盛、歇息、清秀、挺拔、顽强的近义词
推荐资讯
关于匀速直线运动的特点,下列叙述中较完整的
荣海轮胎地址有知道的么?有点事想过去
单位给员工家属颁发一个奖取什么名字
3减括号6.72加1.43括号用简便方法计算一
明天要割包皮了 好紧张 感觉跟要去高考一样
F12010怎么在比赛途中换车胎啊
我爸50开始交社保,还来得及吗?
伤害摩羯女的下场,是死吗?
J联赛的横滨马里诺斯队什么时候改名为横滨水
银龙KTV音乐广场地址有知道的么?有点事想过
铺60平米的复合地板损耗有多少
贵夫人内衣这个地址在什么地方,我要处理点事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?