如何取出criteriaquery in查询中的值

shop++ CriteriaQuery 数据库查询语句
时间: 18:26:46
&&&& 阅读:399
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&hibernate 的criteria 查询语句是一种更加面向对象的方式查询。CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); //创建一个entityManager创建一个CriteriaBuilder 实列CriteriaQuery&T& criteriaQuery = criteriaBuilder.createQuery(entityClass);//criteriaBuilder创建一个createQuery实列,CriteriaQuery被赋予泛型,泛型参数申明CriteriaQuery在执行时返回的结果的类型。criteriaQuery.select(criteriaQuery.from(entityClass)); //在criteriaQuery上设置查询表达式return findList(criteriaQuery, first, count, filters, orders);//返回结果集&&hibernate 中的JPQL 语句&String jpql = "select count(*) from Agent agent where lower(agent.name) = lower(:name)";//创建JPQL 语句,(应当注意的是from后边的Agent 是实体Bean而不是数据表。)&Long count = entityManager.createQuery(jpql, Long.class)//通过entityManager获取一个createQuery实列,第一个位置是JPQL 语句,第二个位置是反射对象 这个对象就是返回值的类型&.MIT).setParameter("name", name)//查询执行时刷新. 设置查询参数.getSingleResult();//返回单个结果&通过两种语句之间的比较可以加深深刻的理解CriteriaQuery 查询语句, 当然前提是必须能熟悉一种语言。在shop++程序中,在使用一般查询的时候还是建议用JPQL语句来实现,因为比如说实现实现一个简单的查询还要创建entityManager 然后再创建一个createQuery实列。。这样就无形中增加了代码,而且代码执行效率也会降低不少。当然如果是想做一个稍微复杂点的查询,比如动态查询,需要增加多个条件数量,排序等等的条件查询都是可以用CriteriaQuery查询语句的。标签:&&&&&&&&&
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!4191人阅读
当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Criteria实例中。这样,程序员可以不使用SQL甚至HQL的情况下进行数据查询,如例程9-1所示。
例程9-1 Criteria应用实例
------------------------------------------------------------------------------------------
Criteria cr = session.createCriteria(Student.class); //生成一个Criteria对象cr.add(Restrictions.eq("name", "Bill"));//等价于where name=’Bill’List list = cr.list();Student stu = (Student)list.get(0);System.out.println(stu.getName());
1.常用的查询限制方法
在例程9-1中,Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制。这些方法及其他一些criteria常用查询限制方法列于表9-1中。
表9-1 Criteria Query常用的查询限制方法
方&&& 法说&&& 明
Restrictions.eq()equal,=
Restrictions.allEq()参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果
Restrictions.gt()greater-than, &
Restrictions.lt()less-than, &
Restrictions.le()less-equal, &=
Restrictions.between()对应SQL的between子句
Restrictions.like()对应SQL的like子句
Restrictions.in()对应SQL的in子句
Restrictions.and()and关系
Restrictions.or()or关系
Restrictions.isNull()判断属性是否为空,为空返回true,否则返回false
Restrictions.isNotNull()与Restrictions.isNull()相反
Order.asc()根据传入的字段进行升序排序
Order.desc()根据传入的字段进行降序排序
MatchMode.EXACT字符串精确匹配,相当于“like 'value'”
MatchMode.ANYWHERE字符串在中间位置,相当于“like '%value%'”
MatchMode.START字符串在最前面的位置,相当于“like 'value%'”
MatchMode.END字符串在最后面的位置,相当于“like '%value'”
例1:查询学生名字以t开头的所有Student对象。
Criteria cr = session.createCriteria(Student.class);cr.add(Restrictions.like(“name”, “t%”))List list = cr.list();Student stu = (Student)list.get(0);
或者使用另一种方式:Criteria cr = session.createCriteria(Student.class);cr.add(Restrictions.like(“name”, “t”, MatchMode.START))List list = cr.list();Student stu = (Student)list.get(0); 例2:查询学生姓名在Bill, Jack和Tom之间的所有Student对象。 String[] names = {“Bill”, “Jack”, “Tom”}Criteria cr = session.createCriteria(Student.class);cr.add(Restrictions.in(“name”, names))List list = cr.list();Student stu = (Student)list.get(0); 例3:查询学生的年龄age等于22或age为空(null)的所有Student对象。Criteria cr = session.createCriteria(Student.class);cr.add(Restrictions.eq(“age”, new Integer(22));cr.add(Restrictions.isNull(“age”));List list = cr.list();Student stu = (Student)list.get(0); 例4:查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序。Criteria cr = session.createCriteria(Student.class);cr.add(Restrictions.like(“name”, “F%”);cr.addOrder(Order.asc(“name”));List list = cr.list();Student stu = (Student)list.get(0);
调用Order.asc的方法应是Criteria的addOrder()方法。
2.连接限制
在Criteria 查询中使用FetchMode来实现连接限制。在HQL语句中,可以通过fetch关键字来表示预先抓取(Eager fetching),如下所示:
from Group gleft join fetch g.students swhere g.name like '%2005'
可以使用Criteria的API完成同样的功能,如下所示:Criteria cr = session.createCriteria(Group.class);cr.setFetchMode(“students”, FetchMode.EAGER);cr.add(Restrictions.like(“name”, “2005”, MatchMode.END))List list = cr.list();
以上两种方式编写的代码,都使用相同的SQL语句完成它们的功能,如下所示:select g.*, s.* from Group gleft outer join Student son g.id = s.group_idwhere g.name like '%2005'&
Hibernate动态条件查询(Criteria Query) 1、创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();
2、缩小结果集范围一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。
List cats = sess.createCriteria(Cat.class).add( Expression.like("name", "Fritz%") ).add( Expression.between("weight", minWeight, maxWeight) ).list();表达式(Expressions)可以按照逻辑分组.
List cats = sess.createCriteria(Cat.class).add( Expression.like("name", "Fritz%") ).add( Expression.or(Expression.eq( "age", new Integer(0) ),Expression.isNull("age")) ).list();List cats = sess.createCriteria(Cat.class).add( Expression.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ).add( Expression.disjunction().add( Expression.isNull("age") ).add( Expression.eq("age", new Integer(0) ) ).add( Expression.eq("age", new Integer(1) ) ).add( Expression.eq("age", new Integer(2) ) )) ).list();有很多预制的条件类型(Expression的子类)。有一个特别有用,可以让你直接嵌入SQL。
List cats = sess.createCriteria(Cat.class).add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING) ).list();其中的{alias}是一个占位符,它将会被所查询实体的行别名所替代。(原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)
3、对结果排序可以使用net.sf.hibernate.expression.Order对结果集排序.
List cats = sess.createCriteria(Cat.class).add( Expression.like("name", "F%").addOrder( Order.asc("name") ).addOrder( Order.desc("age") ).setMaxResults(50).list();4、关联(Associations)你可以在关联之间使用createCriteria(),很容易地在存在关系的实体之间指定约束。
List cats = sess.createCriteria(Cat.class).add( Expression.like("name", "F%").createCriteria("kittens").add( Expression.like("name", "F%").list();注意,第二个createCriteria()返回一个Criteria的新实例,指向kittens集合类的元素。
下面的替代形式在特定情况下有用。
List cats = sess.createCriteria(Cat.class).createAlias("kittens", "kt")&&& .createAlias("mate", "mt").add( Expression.eqProperty("kt.name", "mt.name") ).list();(createAlias())并不会创建一个Criteria的新实例。)
请注意,前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤!如果你希望只返回满足条件的kittens,你必须使用returnMaps()。
List cats = sess.createCriteria(Cat.class).createCriteria("kittens", "kt").add( Expression.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、动态关联对象获取(Dynamic association fetching)可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。
List cats = sess.createCriteria(Cat.class).add( Expression.like("name", "Fritz%") ).setFetchMode("mate", FetchMode.EAGER).list();这个查询会通过外连接(outer join)同时获得 mate和kittens。
6、根据示例查询(Example queries)net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。
Cat cat = new Cat();cat.setSex('F');cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class).add( Example.create(cat) ).list();版本属性,表示符属性和关联都会被忽略。默认情况下,null值的属性也被排除在外。
You can adjust how the Example is applied. 你可以调整示例(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();你甚至可以用示例对关联对象建立criteria。
List results = session.createCriteria(Cat.class).add( Example.create(cat) ).createCriteria("mate").add( Example.create( cat.getMate() ) ).list();
hibernate Query Criteria使用 12:39HQL = "from AirNewinfo as news where (news.newsTypeid = :newsTypeId) order by news.newsid";&& Session session = HibernateSessionFactory.getSession();//&& Query query = session.createQuery(HQL);//&& query.setParameter("newsTypeId" , newsType);//&& query.setFirstResult(start);//&& query.setMaxResults(Page.PAGE_COUNTS);& && Criteria crt = session.createCriteria(AirNewinfo.class);&& crt.add(Expression.eq("newsTypeid", newsType));&& crt.setFirstResult(start);&& crt.setMaxResults(Page.PAGE_COUNTS);&& crt.addOrder(Order.desc("newsid"));&& Expression.between("age",new Integer(13),new Integer(50));
List newsList = crt.list();
&& //List newsList = query.list();
可能很多人象我一样,刚开始接触HQL时,脑袋一片混沌,这是什么语法嘛!!之所以这样,是因为我们总是会先入为主地将之与SQL想比,虽然HQL看起来很SQL,而且设计时就有这样的意图,但是毕竟是两种差别很大的东西,难免就会出现理解偏差的问题。好了,我们今天就不让大家脑袋发晕了,HQL我们暂时放一放。今天我们来说另外一种查询方法:Criteria Query.什么是Criteria Query?简单说,就是将我们的查询条件封装为一个预定义的查询对象,由这个查询对象来执行查询,而不用我们再去写HQL了,而且更接近我们贯常的编程习惯。是不是很不错?让我们来look look:
& //创建关联到某个类的查询对象ICriteria criteria = session.CreateCriteria(typeof(Person));
//添加表达式criteria.Add(Expression.Eq("Name","Jackie Chan"));
IList list = criteria.List();
注意这一句:&& Expression.Eq("Name","Jackie Chan")Eq是Equal的缩写,意思是添加一个查询表达式,Person.Name = “Jackie Chan”
对应HQL就是:from Person p where p.Name=”Jackie Chan”NHibernate会在运行时动态生成类似上面的HQL,我们可以在配置文件把show-sql打开,观看生成的SQL。这样是不是感觉清晰多了?又回到我们以前的编码习惯了!为了对应HQL的种种查询条件,NHibernate预定义了大量的Expression方法,我们列几个如下:HQL的语义,详细的说明请参考api。
& Eq&&&&&&&&& = EqualGt&&&&&&&&& = Greater thanLt&&&&&&&&& = Less thanLike&&&&&&& = LikeNot&&&&&&&& = NotIsNull&&&&& = Is Null
基本上对应了大部分
下面,我们详细介绍Criteria的用法。1. Example查询我们常常有这样的查询页面:用户可以输入“姓名”、“性别”、“年龄”等等来进行查询,而我们常常的做法就是如下的烦琐:
string condition = “”;if(txtName.Text != null)&&&&&&&& condition += “ Name=” + txtName.T
if(txtSex.Text != null)&&&&&&& condition += “ and Sex=” + txtSex.T
代码看起来实在是不甚美观,有什么解决办法呢?
Criteria提供了专为这种问题而设计的Example查询,如下:ICriteria criteria = session.CreateCriteria(typeof(Person));
Person person = new Person();person.Name = "Jackie Chan";person.Age = 50;
//创建一个Example对象criteria.Add(Example.Create(person));IList list = criteria.List();请注意:&&
criteria.Add(Example.Create(person));这句代码的意思是通过构造的person对象的属性来生成表达式,实际生成的代码如下:
SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE (this.age = @p0)对应上面的问题,我们简单地new出一个person对象,然后填充其属性即可,不用再去构造那丑陋的条件判断语句了!
2. 排序我们想对返回的list进行排序,该怎么办呢?如下:ICriteria criteria = session.CreateCriteria(typeof(Person));criteria.Add(Expression.Gt("Age", 20));
//添加一个排序对象criteria.AddOrder(Order.Asc("Age"));
IList list = criteria.List();
criteria.AddOrder(Order.Asc("Age"));这句代码的意思是在criteria上构造一个排序对象,并以Age属性做正序排列,NHibernate在运行时会生成如下语句:
SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE this.age & @p0 ORDER BY this.age asc
如你所猜想,Order类肯定有另外一个“Desc“方法:)3. 限制记录范围在显示大量的记录时,我们常常采用的方法就是分页,如果用NHibernate来做,该怎么办呢?如下代码: ICriteria criteria = session.CreateCriteria(typeof(Person));
//从第10条记录开始取criteria.SetFirstResult(10);
//取20条记录criteria.SetMaxResults(20);
IList list = criteria.List();这样,我们就达到了分页的目的。
注意:NHibernate的分页机制实际上依赖于不同的数据库实现,所以,对特定的某种数据库,并不一定是效率最好的,比如对SQLServer(为什么受伤的总是俺?为什么总是说俺比不上Oracle?俺都赶在2005年年底出2005版本了!!)。想知道为什么吗?很简单,check一下上面代码生成的SQL就清楚了!或者深入点再看看NHibernate的分页代码,我就不解释了,自己动手,丰衣足食:)总体来讲,Criteria对我们来说更熟悉,更容易上手,但是目前Criteria还是不够完善——将对应的HQL一一封装实在太烦琐了,所以NHibernate还是以HQL查询为主,我们在使用的时候则看需要了,要么使用HQL,要么HQL和Criteria混合使用,重要的是解决问题,对不?
Hibernate中Criteria的完整用法 最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法
设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 Hibernate的Criteria 的用法进行总结:&& Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。 && Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 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(Criterion criterion) 方法来添加查询条件。&&&& 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) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件: Example exampleUser =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(new String[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过 criteria 的 add(Project) 方法加入到查询条件中去。 &&& 使用 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();
约束可以按逻辑分组。
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({alias}.name) 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();
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("kt.name", "mt.name") )&&& .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( Projections.projectionList()&&&&&&& .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( 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();
List results = 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()来表示投影:
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( 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来
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)&&& .add( Property.forName("sex").eq('F') );//创建一个SessionSession session = .;Transaction txn = session.beginTransaction();List results = query.getExecutableCriteria(session).setMaxResults(100).list();<mit();session.close();
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)&&& .setProjection( Property.forName("weight").avg() );session.createCriteria(Cat.class)&&& .add( Property.forName("weight).gt(avgWeight) )&&& .list();DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)&&& .setProjection( Property.forName("weight") );session.createCriteria(Cat.class)&&& .add( Subqueries.geAll("weight", weights) )&&& .list();
相互关联的子查询也是有可能的:
DetachedCriteria avgWeightForSex = 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();(5)
Hibernate 深入研究之 Criteria日 星期一 09:33 00:51&&& 最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。所以现在对 Hibernate 的 Criteria 深入研究一下。《 Hibernate Reference 》及网上其它一些资料对 Criteria 已经做了很多介绍。本文主要是从 Criteria 的结构入手来进行分析。 &&&&&& 如图 1 。 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的顶级接口,其下面提供了 Criteria 和 DetachedCriteria 。
Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session , DetachedCriteria 提供了 4 个静态方法 forClass(Class) 或 forEntityName(Name) 进行 DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。
如图 1 , Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。
下面就对 Criterion 和 Projection 进行详细说明。&&&&&
Criterion 是 Criteria 的查询条件。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:187719次
积分:3114
积分:3114
排名:第9786名
原创:122篇
转载:39篇
评论:29条
(1)(3)(4)(2)(1)(11)(43)(18)(3)(45)(29)(1)

我要回帖

更多关于 criteria和query 的文章

 

随机推荐