mybaties中一个方法怎么使用两次criteria.and方法
答案:2 悬赏:0 手机版
解决时间 2021-02-10 02:17
- 提问者网友:活着好累
- 2021-02-09 04:07
mybaties中一个方法怎么使用两次criteria.and方法
最佳答案
- 五星知识达人网友:拾荒鲤
- 2021-02-09 05:44
ries set us thinking, wondering what we sho
全部回答
- 1楼网友:动情书生
- 2021-02-09 06:20
最近在项目中使用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();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯