苏格兰风笛

一个人是穷人还是富人,主要取决于"出身、运气和努力",这些因素中最不重要的因素就是努力!

用户操作
[即时聊天] [发私信] [加为好友]
xiaID:xymyeah
148397次访问,排名554,好友0人,关注者2人。
xymyeah的文章
原创 54 篇
翻译 0 篇
转载 294 篇
评论 25 篇
xymyeah的公告
xymyeah@163.com
技术之家圈子http://blog.csdn.net/group/xymyeah欢迎加盟
最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
RickeyShao:不错,整好需要
jack803:假设a = 10000001, a>>>2,a>>2 结果都是32?
jack803:你好,为什么我用计算机运行出来的 >>>2 和 >>2 结果完全一样?谢谢
文章分类
收藏
相册
神话空间
AJAX
ajax特效
icefaces
Java开源 AJAX开发组件
jQuery中文社区
jsf ajax
blog收藏
baggio785的专栏
blueroc收藏
firebody
gembin
Java对Xml进行解析
jdom详解
JFreeChart
langhua opencms
opencms
opencms
干煸四季豆
滴水的能量
电信网管
CORBA
Brief Tutorial on CORBA
CORBA Technology and the Java Platform
EJB3.0
EJB3.0开发指南
EJB3Trail
Enterprise JavaBeans 3.0, 5th Edition
IBM
MyEclipse EJB Project 快速开始
hibernate
hibernate中文网站
hibernate官方网站
xdoclet Hibernate Tags
j2ee
cms4j
cms4j blog
ComponentReference
freemarker
ireport
J2EE v1.4 Documentation
javaeye tapestry
javatang(ajax等)
Jmesa(分页工具)
open source cms mmbase
quartz
Struts-menu
struts标记库
subersion eclipse
Tapestry中文文档
Tapestry中文文档
老高
J2ME
java application
Java swing tutorial
JViews Telecom Graphic Objects
JavaScript
google个性主页的拖拽效果的js
JavaScript高级教程
Java基础
java jar包下载
java在线API
java线程并发包util.concurrent的研究
JXTA
NetBeans IDE官方教程
Thinking in Patterns with Java(中文版)
中文版jdk API
文件对比工具
JBOSS
JBoss Web Services
JOSS工具箱
JSF、Groovy、Drools
Drools
JSF in javaeye
JSF中文论坛
Liferay
Liferay Portal 系列文章
Liferay个人收集
Liferay英文站点
liferay论坛
Seam
3-ways-to-easy-ajax-in-seam-jsf-facelets-prelude
JavaEye Jboss Seam
Jboss Seam
JBoss Seam中文站
jboss seam开发
Seam - 无缝集成 JSF
Seam 2.0 Reference中文翻译
SEAM 安装和版本说明
seam-next-gen-web-framework/
Spring
Acegi 扩展开发
acegi官方网站
Acegi文档翻译与笔记
AppFuse
Security Acegi
springside 中文
Spring中文网站
Spring官方网站
Spring开发参考手册
Spring聚集
UML
jude
RUP 学堂
WebServices
AppFuseXFire
Java Technology and Web Services
Java Technology and Web Services - Documentation
Learn technology
SOA
SOA and Web services IBM
SOA专家群
SOA专题
Web Services Code Samples
电信
ctiforum
Essential SNMP, 2nd Edition
openvoip
中国网管联盟
通信专业门户
通信技术
工作流
Jboss JBPM
JBoss jBPM 3.1
JBPM
JBPM Group
jBPM开发入门指南
osworkflow
开源社区
cas
Cindy
数据库
Oracle® Database PL/SQL User's Guide and Reference
PL/SQL User's Guide and Reference
xsb Oracle Blog
甲骨文学(oracle)
网络
Getting Started with JCR
JCR示例项目
JSR 170
NetBios, NetBEUI, NBF, SMB, CIFS Networking
perforce
Slide
项目管理
CMMI ON LINE
CMMI V1.2 中文版
IT项目管理 企业级项目管理
IT项目管理专题
JAVAEYE软件开发和项目管理版
Sunspl技术管理
thoughtworks
如何快速学习CMMI?
开发文档网
项目管理
项目管理资源网
杂记
opengroup
月光博客
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 Hibernate---Criteria收藏

新一篇: Hibernate---Criteria | 旧一篇: 分析Hibernate的事务处理机制

Hibernate---Criteria
具有一个直观的、可扩展的条件查询API是Hibernate的特色。 

15.1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。 

Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
15.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();
15.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();
15.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");
}
15.5. 动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 

List cats = 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类允许你通过一个给定实例 构建一个条件查询。 

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 comparisons
List 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();
15.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();
15.8. 离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。 

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
    .add( Property.forName("sex").eq('F') );
    
Session session = ....;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
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();

 //具体应用

把HSQL语句用Criteria代替,感觉更加美观一点,而且还支持中文,要是HSQL想支持中文,你得使用占位符来设置,具体可参照:http://.blogdriver.com//983190.html

那么Criteria的用法是这样的:

    public Collection findCriteria(final DetachedCriteria dc, final IPage page) {
        return (List) getHibernateTemplate().execute(new HibernateCallback(){
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Criteria c = dc.getExecutableCriteria(session);
               
                page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());
                c.setProjection(null);
                c.setResultTransformer(Criteria.ROOT_ENTITY);
                c.setFirstResult(page.getBeginIndex());
                c.setMaxResults(page.getPageSize());
                return c.list();
            }
        }, true);
    }

其中的参数true表示要Spring强制传入SessionImpl,而不是传入Proxy代理类,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());
c.setProjection(null); 目的是为了获得行数,并设置投影为空,为的是返回List出来,如果不设置setProjection(null)的话,c.list将返回的是行数(int型),而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成PassThroughResultTransformer,criteria.list的时候可能结果会跟理想的不一样。所以我们还要再c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entity的形式返回,而不是Object[]的形式返回。具体的ResultTransformer可以google一下。

测试代码如下:

    public void testCriteria() {
        DetachedCriteria dc = DetachedCriteria.forClass(User.class);
        dc.add(Restrictions.eq("name", "user")).add(Restrictions.like("description", "%主管人员%"));
        IPage page = new Page();
        page.setCurrentPage(1);
        page.setPageSize(10);
        Collection list = _userDAO.findCriteria(dc, page);
        assertNotNull(list);
        assertEquals(1, list.size());
    }

来源:http://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry

 

发表于 @ 2006年07月10日 10:19:00|评论(loading...)|编辑

新一篇: Hibernate---Criteria | 旧一篇: 分析Hibernate的事务处理机制

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © xymyeah