1、Hibernate三大类查询总结Hibernate目前总共分为三大类查询:cretiria,hql,本地sql 【以下篇章搜集于网络,感谢作者】第一:关于cretiria的查询 具有一个直观的、可扩展的条件查询API是Hibernate的特色。 15.1. 创建一个Criteria 实例org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。Java代码 1. Criteriacrit=sess.createCriteria(Cat.class); 2. crit.setMaxResults(50); 3. Listcats=cr
2、it.list();Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();15.2. 限制结果集内容一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .add(Restricti
3、ons.like(name,Fritz%) 3. .add(Restrictions.between(weight,minWeight,maxWeight) 4. .list(); List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.between(weight, minWeight, maxWeight) ) .list();约束可以按逻辑分组。Java代码 1. Listcats=sess.createCriteria(Cat.class)
4、 2. .add(Restrictions.like(name,Fritz%) 3. .add(Restrictions.or( 4. Restrictions.eq(age,newInteger(0), 5. Restrictions.isNull(age) 6. ) 7. .list(); 8. Listcats=sess.createCriteria(Cat.class) 9. .add(Restrictions.in(name,newStringFritz,Izi,Pk) 10. .add(Restrictions.disjunction() 11. .add(Restrictions
5、.isNull(age) 12. .add(Restrictions.eq(age,newInteger(0) 13. .add(Restrictions.eq(age,newInteger(1) 14. .add(Restrictions.eq(age,newInteger(2) 15. ) 16. .list();List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.or( Restrictions.eq( age, new Integer(
6、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) )
7、 ) .add( Restrictions.eq(age, new Integer(2) ) ) ) ) .list();Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .add(Restrictions.sql(lower(alias.name)likelower(?),Fritz%,Hibernate.STRING) 3. .list(); List cats = sess.createCrite
8、ria(Cat.class) .add( Restrictions.sql(lower(alias.name) like lower(?), Fritz%, Hibernate.STRING) ) .list();alias占位符应当被替换为被查询实体的列别名。 Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。Java代码 1. Propertyage=Property.forName(age); 2. Listcats=sess.createCriteria(Cat.class) 3. .add(Restrict
9、ions.disjunction() 4. .add(age.isNull() 5. .add(age.eq(newInteger(0) 6. .add(age.eq(newInteger(1) 7. .add(age.eq(newInteger(2) 8. ) 9. .add(Property.forName(name).in(newStringFritz,Izi,Pk) 10. .list();Property age = Property.forName(age);List cats = sess.createCriteria(Cat.class) .add( Restrictions.
10、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();15.3. 结果集排序你可以使用org.hibernate.criterion.Order来为查询结果排序。Java代码 1. Listcats=sess.createCriteri
11、a(Cat.class) 2. .add(Restrictions.like(name,F%) 3. .addOrder(Order.asc(name) 4. .addOrder(Order.desc(age) 5. .setMaxResults(50) 6. .list(); 7. Listcats=sess.createCriteria(Cat.class) 8. .add(Property.forName(name).like(F%) 9. .addOrder(Property.forName(name).asc() 10. .addOrder(Property.forName(age)
12、.desc() 11. .setMaxResults(50) 12. .list(); 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(
13、Property.forName(name).asc() ) .addOrder( Property.forName(age).desc() ) .setMaxResults(50) .list();15.4. 关联你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .add(Restrictions.like(name,F%) 3. .createCriteria(kittens) 4. .add(Restrictions.like(name,F%) 5.
14、.list(); List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(name, F%) .createCriteria(kittens) .add( Restrictions.like(name, F%) .list();注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。 接下来,替换形态在某些情况下也是很有用的。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .createAlias
15、(kittens,kt) 3. .createAlias(mate,mt) 4. .add(Restrictions.eqProperty(kt.name,mt.name) 5. .list(); List cats = sess.createCriteria(Cat.class) .createAlias(kittens, kt) .createAlias(mate, mt) .add( Restrictions.eqProperty(kt.name, mt.name) ) .list();(createAlias()并不创建一个新的 Criteria实例。) Cat实例所保存的之前两次查询
16、所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .createCriteria(kittens,kt) 3. .add(Restrictions.eq(name,F%) 4. .returnMaps() 5. .list(); 6. Iteratoriter=cats.iterator(); 7. while(iter.hasNext() 8. Mapmap=(Map)iter.next(); 9. Catc
17、at=(Cat)map.get(Criteria.ROOT_ALIAS); 10. Catkitten=(Cat)map.get(kt); 11. 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 = (C
18、at) map.get(Criteria.ROOT_ALIAS); Cat kitten = (Cat) map.get(kt);15.5. 动态关联抓取你可以使用setFetchMode()在运行时定义动态关联抓取的语义。Java代码 1. Listcats=sess.createCriteria(Cat.class) 2. .add(Restrictions.like(name,Fritz%) 3. .setFetchMode(mate,FetchMode.EAGER) 4. .setFetchMode(kittens,FetchMode.EAGER) 5. .list(); List c
19、ats = sess.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .setFetchMode(mate, FetchMode.EAGER) .setFetchMode(kittens, FetchMode.EAGER) .list();这个查询可以通过外连接抓取mate和kittens。 查看第 19.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。 15.6. 查询示例org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查
20、询。Java代码 1. Catcat=newCat(); 2. cat.setSex(F); 3. cat.setColor(Color.BLACK); 4. Listresults=session.createCriteria(Cat.class) 5. .add(Example.create(cat) 6. .list();Cat cat = new Cat();cat.setSex(F);cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class) .add( Example.create(cat)
21、) .list();版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 你可以自行调整Example使之更实用。Java代码 1. Exampleexample=Example.create(cat) 2. .excludeZeroes()/excludezerovaluedproperties 3. .excludeProperty(color)/excludethepropertynamedcolor 4. .ignoreCase()/performcaseinsensitivestringcomparisons 5. .enableLike();/uselikefors
22、tringcomparisons 6. Listresults=session.createCriteria(Cat.class) 7. .add(example) 8. .list();Example example = Example.create(cat) .excludeZeroes() /exclude zero valued properties .excludeProperty(color) /exclude the property named color .ignoreCase() /perform case insensitive string comparisons .e
23、nableLike(); /use like for string comparisonsList results = session.createCriteria(Cat.class) .add(example) .list();你甚至可以使用examples在关联对象上放置条件。Java代码 1. Listresults=session.createCriteria(Cat.class) 2. .add(Example.create(cat) 3. .createCriteria(mate) 4. .add(Example.create(cat.getMate() 5. .list();
24、List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .createCriteria(mate) .add( Example.create( cat.getMate() ) ) .list();15.7. 投影(Projections)、聚合(aggregation)和分组(grouping)org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。 在一个条件查询中没有必要显式的使
25、用 group by 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。 你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:Java代码 1. Listresults=session.createCriteria(Cat.class) 2. .setProjection(Projections.alias(Projections.groupProperty(color),colr) 3. .addOrder(Order.asc(colr) 4. .list(); 5. Listresults=session.cre
26、ateCriteria(Cat.class) 6. .setProjection(Projections.groupProperty(color).as(colr) 7. .addOrder(Order.asc(colr) 8. .list(); alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:Java代码 1. Listresults=session.createCriteria(Cat.class) 2. .setProjection(Projections.projec
27、tionList() 3. .add(Projections.rowCount(),catCountByColor) 4. .add(Projections.avg(weight),avgWeight) 5. .add(Projections.max(weight),maxWeight) 6. .add(Projections.groupProperty(color),color) 7. ) 8. .addOrder(Order.desc(catCountByColor) 9. .addOrder(Order.desc(avgWeight) 10. .list(); 11. Listresults=session.createCriteria(Domestic.clas
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2