Hibernate三大类查询总结.docx
- 文档编号:17661017
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:24
- 大小:24.74KB
Hibernate三大类查询总结.docx
《Hibernate三大类查询总结.docx》由会员分享,可在线阅读,更多相关《Hibernate三大类查询总结.docx(24页珍藏版)》请在冰点文库上搜索。
Hibernate三大类查询总结
Hibernate目前总共分为三大类查询:
cretiria,hql,本地sql【以下篇章搜集于网络,感谢作者】
第一:
关于cretiria的查询
具有一个直观的、可扩展的条件查询API是Hibernate的特色。
15.1.创建一个Criteria实例
org.hibernate.Criteria接口表示特定持久类的一个查询。
Session是Criteria实例的工厂。
Java代码
1.Criteria crit = sess.createCriteria(Cat.class);
2.crit.setMaxResults(50);
3.List cats = crit.list();
Criteriacrit=sess.createCriteria(Cat.class);
crit.setMaxResults(50);
Listcats=crit.list();
15.2.限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。
org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.like("name", "Fritz%") )
3. .add( Restrictions.between("weight", minWeight, maxWeight) )
4. .list();
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.add(Restrictions.between("weight",minWeight,maxWeight))
.list();
约束可以按逻辑分组。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.like("name", "Fritz%") )
3. .add( Restrictions.or(
4. Restrictions.eq( "age", new Integer(0) ),
5. Restrictions.isNull("age")
6. ) )
7. .list();
8.List cats = sess.createCriteria(Cat.class)
9. .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
10. .add( Restrictions.disjunction()
11. .add( Restrictions.isNull("age") )
12. .add( Restrictions.eq("age", new Integer(0) ) )
13. .add( Restrictions.eq("age", new Integer
(1) ) )
14. .add( Restrictions.eq("age", new Integer
(2) ) )
15. ) )
16. .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。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.sql("lower({alias}.name) like lower(?
)", "Fritz%", Hibernate.STRING) )
3. .list(); Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.sql("lower({alias}.name)likelower(?
)","Fritz%",Hibernate.STRING))
.list();
{alias}占位符应当被替换为被查询实体的列别名。
Property实例是获得一个条件的另外一种途径。
你可以通过调用Property.forName()创建一个Property。
Java代码
1.Property age = Property.forName("age");
2.List cats = sess.createCriteria(Cat.class)
3. .add( Restrictions.disjunction()
4. .add( age.isNull() )
5. .add( age.eq( new Integer(0) ) )
6. .add( age.eq( new Integer
(1) ) )
7. .add( age.eq( new Integer
(2) ) )
8. ) )
9. .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
10. .list();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();
15.3.结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.like("name", "F%")
3. .addOrder( Order.asc("name") )
4. .addOrder( Order.desc("age") )
5. .setMaxResults(50)
6. .list();
7.List cats = sess.createCriteria(Cat.class)
8. .add( Property.forName("name").like("F%") )
9. .addOrder( Property.forName("name").asc() )
10. .addOrder( Property.forName("age").desc() )
11. .setMaxResults(50)
12. .list();
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();
15.4.关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.like("name", "F%")
3. .createCriteria("kittens")
4. .add( Restrictions.like("name", "F%")
5. .list();
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","F%")
.createCriteria("kittens")
.add(Restrictions.like("name","F%")
.list();
注意第二个createCriteria()返回一个新的Criteria实例,该实例引用kittens集合中的元素。
接下来,替换形态在某些情况下也是很有用的。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .createAlias("kittens", "kt")
3. .createAlias("mate", "mt")
4. .add( Restrictions.eqProperty("kt.name", "mt.name") )
5. .list();
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()。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .createCriteria("kittens", "kt")
3. .add( Restrictions.eq("name", "F%") )
4. .returnMaps()
5. .list();
6.Iterator iter = cats.iterator();
7.while ( iter.hasNext() ) {
8. Map map = (Map) iter.next();
9. Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
10. Cat kitten = (Cat) map.get("kt");
11.}
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");
}
15.5.动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
Java代码
1.List cats = sess.createCriteria(Cat.class)
2. .add( Restrictions.like("name", "Fritz%") )
3. .setFetchMode("mate", FetchMode.EAGER)
4. .setFetchMode("kittens", FetchMode.EAGER)
5. .list();
Listcats=sess.createCriteria(Cat.class)
.add(Restrictions.like("name","Fritz%"))
.setFetchMode("mate",FetchMode.EAGER)
.setFetchMode("kittens",FetchMode.EAGER)
.list();
这个查询可以通过外连接抓取mate和kittens。
查看第19.1节“抓取策略(Fetchingstrategies)”可以获得更多信息。
15.6.查询示例
org.hibernate.criterion.Example类允许你通过一个给定实例构建一个条件查询。
Java代码
1.Cat cat = new Cat();
2.cat.setSex('F');
3.cat.setColor(Color.BLACK);
4.List results = session.createCriteria(Cat.class)
5. .add( Example.create(cat) )
6. .list();
Catcat=newCat();
cat.setSex('F');
cat.setColor(Color.BLACK);
Listresults=session.createCriteria(Cat.class)
.add(Example.create(cat))
.list();
版本属性、标识符和关联被忽略。
默认情况下值为null的属性将被排除。
你可以自行调整Example使之更实用。
Java代码
1.Example example = Example.create(cat)
2. .excludeZeroes() //exclude zero valued properties
3. .excludeProperty("color") //exclude the property named "color"
4. .ignoreCase() //perform case insensitive string comparisons
5. .enableLike(); //use like for string comparisons
6.List results = session.createCriteria(Cat.class)
7. .add(example)
8. .list();
Exampleexample=Example.create(cat)
.excludeZeroes()//excludezerovaluedproperties
.excludeProperty("color")//excludethepropertynamed"color"
.ignoreCase()//performcaseinsensitivestringcomparisons
.enableLike();//uselikeforstringcomparisons
Listresults=session.createCriteria(Cat.class)
.add(example)
.list();
你甚至可以使用examples在关联对象上放置条件。
Java代码
1.List results = session.createCriteria(Cat.class)
2. .add( Example.create(cat) )
3. .createCriteria("mate")
4. .add( Example.create( cat.getMate() ) )
5. .list();
Listresults=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()应用投影到一个查询。
在一个条件查询中没有必要显式的使用"groupby"。
某些投影类型就是被定义为分组投影,他们也出现在SQL的groupby子句中。
你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。
下面是两种不同的实现方式:
Java代码
1.List results = session.createCriteria(Cat.class)
2. .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
3. .addOrder( Order.asc("colr") )
4. .list();
5.List results = session.createCriteria(Cat.class)
6. .setProjection( Projections.groupProperty("color").as("colr") )
7. .addOrder( Order.asc("colr") )
8. .list();
alias()和as()方法简便的将一个投影实例包装到另外一个别名的Projection实例中。
简而言之,当你添加一个投影到一个投影列表中时你可以为它指定一个别名:
Java代码
1.List results = session.createCriteria(Cat.class)
2. .setProjection( Projections.projectionList()
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.List results = session.createCriteria(Domestic.clas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 大类 查询 总结
![提示](https://static.bingdoc.com/images/bang_tan.gif)