??xml version="1.0" encoding="utf-8" standalone="yes"?>av福利在线导航,国产精品污www一区二区三区,免费看国产精品一二区视频http://www.aygfsteel.com/liaojiyong/category/12345.htmlzh-cnThu, 29 Mar 2007 11:18:55 GMTThu, 29 Mar 2007 11:18:55 GMT60Hibernate O/R映射三大基本定则(?http://www.aygfsteel.com/liaojiyong/archive/2007/03/29/107230.htmlliaojiyongliaojiyongThu, 29 Mar 2007 07:06:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2007/03/29/107230.htmlhttp://www.aygfsteel.com/liaojiyong/comments/107230.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2007/03/29/107230.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/107230.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/107230.html在Java环境下,有多U对象关pL方法,如实体Bean、OJB、JDO、JDBC{。Hibernate是一U新的O/R映射工具Q它不仅提供了从Javacd数据表的映射Q也提供了数据查询和恢复{机制。Hibernate非常单易?目前国内有很多同行已l或正在用Hibernate开发实施项?但Hibernate有很多规则不Zh知或应用甚少。本文的目的是这些规则归Uxȝ,希望Ҏ(gu)的开发和设计有益?br />
首先声明,本文是Hibernate入门U文?高手请不用往下看了?br />
2. 基本定则

定则一:数据库配|文件名U可以不是Hibernate.properties或Hibernate.cfg.xml

׃Hibernate官方文档(本文指www.hibernate.org的文?的媄?很多Hibernate开发者误以ؓ(f)pȝ一定要有名UCؓ(f)Hibernate.properties或Hibernate.cfg.xml的文?而且一定要攑֜classes的根目录下。实际上,该文件只是一般的配置文g,名称可以自己?文g位置可以自己?而且在多数据库环境下,可以有多个配|文?使得E序可以q接多个数据库。只是?zhn)在创Z(x)话工厂时需要特D处?代码CZ如下:

//配置文g名称

protected static String CONFIG_FILE = "my_hibernate.config";

//配置文g目录,可以考虑在该目录下存攄l所有配|文?此处使用虚拟机参?br />
String configPath = System.getProperty("my.config");

//创徏?x)话工?

sessionFactory =( new Configuration().configure(new File(configPath+File.separator+CONFIG_FILE))) .buildSessionFactory();



定则?型目?.hbm.xml文g可以合ƈC个文件中

同样׃Hibernate官方文档的媄?很多Hibernate开发者误以ؓ(f)Hibernate的对象关pL一定要一个表对应一个对?q将映射文g和对象文件放在同一目录下。实际上,该模式是范性考虑而设计的,因ؓ(f)在多人参与的目?多h要维护同一文gҎ(gu)产生冲突;当项目比较小?配置文g的维护h员少,我们完全可以?hbm.xml文g合ƈC个或者几个文件中。依据作者本人的目设计开发经?最好是目中有几h同时从事O/R映射和持久工?则设定几?hbm.xml文g,每hl护一个。当?Z便于分类和管?每h的工作应该按逻辑划分?br />
大型目中的文g配置CZ如下:

<hibernate-configuration>

<session-factory>

<!—映文件分?-->

<mapping resource="com/hongsoft/test/ persistence/Cat.hbm.xml"/>

<mapping resource="com/hongsoft/test/ persistence/Animal.hbm.xml"/>

</session-factory>

</hibernate-configuration>

型目中的文g配置CZ如下:

<hibernate-configuration>

<session-factory>

<!—映文仉?-->

<mapping resource="res_hibernate_map.xml"/>

</session-factory>

</hibernate-configuration>

要注意的? 从对Hibernate源代码的分析可知,指定映射文g?不能用绝对目?只能用相对目?而且,pȝ以classes根目录ؓ(f)当前目录?br />


定则?对象关系映射是以.hbm.xml文g为基准的,而不是以PO文g为基?br />
该定律的意思是:pȝ启动查?zhn)的对象关pL是否正时,是以.hbm.xml为基准来q行查的;对象文g的property可以比映文件的property?但不能少。如果?zhn)有如下的映?

<class name="com.hongsoft.test.User" table="res_user">

<id name="id" column="id" type="long" unsaved-value="any">

<generator class="assigned">

</generator>

</id>

<property name="name"/>

<property name="loginName"/>

<property name="passwd"/>

</class>

pȝ启动,查数据库和其他配|正后,以该文件ؓ(f)基准,首先查User对象中有无id属性和对应的get/setҎ(gu),如果没有则报?如果有且正确则检查有无name属性和对应的get/setҎ(gu)…?直到文gl束。要注意的是,如果属性ؓ(f)name,则getҎ(gu)名称必须为getName(),setҎ(gu)名称必须为setName(),否则?x)报错?br />
如果User对象除了有id,name,loginName, passwd四个属性和对应的方?q有其它的属性和Ҏ(gu),?x)报错?不会(x),因ؓ(f)对象关系映射是以.hbm.xml文g为基准的,而不是以PO文g为基准。?zhn)在项目中可以充分利用该特?实现(zhn)自q比较Ҏ(gu)的需求。例?(zhn)可以在User对象中加入updatedPasswd表示更改后的口o(h),由此构造在表示层要使用的FormBean和在业务层要使用的ValueObject。当?q样做也有缺?需要根据?zhn)的实际情况而定?br />
3. ȝ
上面是作者对Hibernate映射的容易理解错误的知识点的归纳ȝ,希望Ҏ(gu)有帮助。如果?zhn)发现有错误或有自q观点,Ƣ迎讨论?br />

liaojiyong 2007-03-29 15:06 发表评论
]]>
HibernateE序性能优化的考虑要点(? http://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105725.htmlliaojiyongliaojiyongFri, 23 Mar 2007 01:48:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105725.htmlhttp://www.aygfsteel.com/liaojiyong/comments/105725.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105725.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/105725.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/105725.html  初用HIBERNATE的h也许都遇到过性能问题Q实现同一功能Q用HIBERNATE与用JDBC性能相差十几倍很正常Q如果不?qing)早调整Q很可能影响整个目的进度?/p>

  大体上,对于HIBERNATE性能调优的主要考虑点如?

  Ø 数据库设计调?/p>

  Ø HQL优化

  Ø API的正?如根据不同的业务cd选用不同的集合及(qing)查询API)

  Ø 主配|参?日志Q查询缓存,fetch_size, batch_size{?

  Ø 映射文g优化(ID生成{略Q二U缓存,延迟加蝲Q关联优?

  Ø 一U缓存的理

  Ø 针对二~存Q还有许多特有的{略

  Ø 事务控制{略?/p>

  1?数据库设?/p>

  a) 降低兌的复杂?/p>

  b) 量不用联合主?/p>

  c) ID的生成机Ӟ不同的数据库所提供的机制ƈ不完全一?/p>

  d) 适当的冗余数据,不过分追求高范式

  2?HQL优化

  HQL如果抛开它同HIBERNATE本n一些缓存机制的兌QHQL的优化技巧同普通的SQL优化技巧一P可以很容易在|上扑ֈ一些经验之谈?/p>

  3?主配|?/p>

  a) 查询~存Q同下面讲的~存不太一P它是针对HQL语句的缓存,卛_全一L(fng)语句再次执行时可以利用缓存数据。但是,查询~存在一个交易系l?数据变更频繁Q查询条件相同的机率q不?中可能会(x)起反作用:它会(x)白白耗费大量的系l资源但却难以派上用场?/p>

  b) fetch_sizeQ同JDBC的相兛_C用类|参数q不是越大越好,而应Ҏ(gu)业务特征去设|?/p>

  c) batch_size同上?/p>

  d) 生pȝ中,切记要关掉SQL语句打印?/p>

  4?~存

  a) 数据库~存:q~存是最高效和安全的Q但不同的数据库可管理的层次q不一P比如Q在ORACLE中,可以在徏表时指定整个表|于~存当中?/p>

  b) SESSION~存:在一个HIBERNATE SESSION有效Q这U缓存的可干预性不强,大多于HIBERNATE自动理Q但它提供清除缓存的Ҏ(gu)Q这在大扚w增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会(x)发现OutofMemeroy的异常,q时可能需要手动清除这一U缓?Session.evict以及(qing)Session.clear

  c) 应用~存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此Q各cȝ略也考虑的较多,在将数据攑օq一U缓存之前,需要考虑一些前提条?

  i. 数据不会(x)被第三方修改(比如Q是否有另一个应用也在修改这些数?)

  ii. 数据不会(x)太大

  iii. 数据不会(x)频繁更新(否则使用CACHE可能适得其反)

  iv. 数据?x)被频繁查?/p>

  v. 数据不是关键数据(如涉?qing)钱Q安全等斚w的问??/p>

  ~存有几UŞ式,可以在映文件中配置:read-only(只读Q适用于很变更的静态数?历史数据)Qnonstrict-read-writeQread-write(比较普遍的Ş式,效率一?Qtransactional(JTA中,且支持的~存产品较少)

  d) 分布式缓?同c)的配|一P只是~存产品的选用不同Q在目前的HIBERNATE中可供选择的不多,oscache, jboss cacheQ目前的大多数项目,对它们的用于集群的?特别是关键交易系l?都持保守态度。在集群环境中,只利用数据库U的~存是最安全的?/p>

  5?延迟加蝲

  a) 实体延迟加蝲:通过使用动态代理实?/p>

  b) 集合延迟加蝲:通过实现自有的SET/LISTQHIBERNATE提供了这斚w的支?/p>

  c) 属性gq加?

  6?Ҏ(gu)选用

  a) 完成同样一件事QHIBERNATE提供了可供选择的一些方式,但具体用什么方式,可能用性能/代码都会(x)有媄响。显C,一ơ返回十万条记录(List/Set/Bag/Map{?q行处理Q很可能D内存不够的问题,而如果用Z游标(ScrollableResults)或Iterator的结果集Q则不存在这L(fng)问题?/p>

  b) Session的load/getҎ(gu)Q前者会(x)使用二~存Q而后者则不用?/p>

  c) Query和list/iteratorQ如果去仔细研究一下它们,你可能会(x)发现很多有意思的情况Q二者主要区?如果使用了SpringQ在HibernateTemplate中对应find,iteratorҎ(gu)):

  i. list只能利用查询~存(但在交易pȝ中查询缓存作用不?Q无法利用二U缓存中的单个实体,但list查出的对象会(x)写入二~存Q但它一般只生成较少的执行SQL语句Q很多情况就是一?无关??/p>

  ii. iterator则可以利用二U缓存,对于一条查询语句,它会(x)先从数据库中扑և所有符合条件的记录的IDQ再通过IDȝ存找Q对于缓存中没有的记录,再构造语句从数据库中查出Q因此很Ҏ(gu)知道Q如果缓存中没有MW合条g的记录,使用iterator?x)生N+1条SQL语句(N为符合条件的记录?

  iii. 通过iteratorQ配合缓存管理APIQ在量数据查询中可以很好的解决内存问题Q如:

  while(it.hasNext()){

  YouObject object = (YouObject)it.next();

  session.evict(youObject);

  sessionFactory.evice(YouObject.class, youObject.getId());

  }

  如果用listҎ(gu)Q很可能出OutofMemory错误了?/p>

  iv. 通过上面的说明,我想你应该知道如何去使用q两个方法了?/p>

  7?集合的选用

  在HIBERNATE 3.1文档的?9.5. Understanding Collection performance”中有详l的说明?/p>

  8?事务控制

  事务斚wҎ(gu)能有媄响的主要包括:事务方式的选用Q事务隔ȝ别以?qing)锁的选用

  a) 事务方式选用:如果不涉?qing)多个事务管理器事务的话Q不需要用JTAQ只有JDBC的事务控制就可以?/p>

  b) 事务隔离U别:参见标准的SQL事务隔离U别

  c) 锁的选用:(zhn)观?一般由具体的事务管理器实现)Q对于长事务效率低,但安全。乐观锁(一般在应用U别实现)Q如在HIBERNATE中可以定义VERSION字段Q显Ӟ如果有多个应用操作数据,且这些应用不是用同一U乐观锁机制Q则乐观锁会(x)失效。因此,针对不同的数据应有不同的{略Q同前面许多情况一P很多时候我们是在效率与安全/准确性上找一个^衡点Q无论如何,优化都不是一个纯技术的问题Q你应该对你的应用和业务特征有够的了解?/p>

  9?扚w操作

  即是用JDBCQ在q行大批数据更新ӞBATCH与不使用BATCH有效率上也有很大的差别。我们可以通过讄batch_size来让其支持批量操作?/p>

  举个例子Q要扚w删除某表中的对象Q如“delete Account”,打出来的语句Q会(x)发现HIBERNATE扑և了所有ACCOUNT的IDQ再q行删除Q这主要是ؓ(f)了维护二U缓存,q样效率肯定高不了,在后l的版本中增加了bulk delete/updateQ但q也无法解决~存的维护问题。也是_(d)׃有了二~存的维护问题,HIBERNATE的批量操作效率ƈ不尽如h?

  从前面许多要点可以看出,很多时候我们是在效率与安全/准确性上找一个^衡点Q无论如何,优化都不是一个纯技术的问题Q你应该对你的应用和业务特征有够的了解Q一般的Q优化方案应在架构设计期基本确定,否则可能D没必要的q工Q致佉K目g期,而作为架构师和项目经理,q要面对开发h员可能的抱怨,必竟Q我们对用户需求更改的控制力不大,但技?架构风险是应该在初期意识到ƈ制定好相关的对策?/p>

  q有一点要注意Q应用层的缓存只是锦上添花,永远不要把它当救命稻草,应用的根?数据库设计,法Q高效的操作语句Q恰当API的选择{?才是最重要的?/p>

liaojiyong 2007-03-23 09:48 发表评论
]]>
Hibernate大数据量操作解决Ҏ(gu)Q轉Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93454.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 12 Jan 2007 07:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93454.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/93454.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/93454.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/93454.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="postTitle"> <font size="4">阅读了Hibernate的Reference之后Q可以采用批量处理的Ҏ(gu)Q当插入的数据超q?0000Ӟflush sessionq且clear?/font> </div> <div align="left"> <font size="4">下面是一个测试method?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_96_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_96_Open_Text.style.display='none'; Codehighlighter1_0_96_Closed_Image.style.display='inline'; Codehighlighter1_0_96_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_96_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_96_Closed_Text.style.display='none'; Codehighlighter1_0_96_Open_Image.style.display='inline'; Codehighlighter1_0_96_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span>/** */<span>/**<br /></span><span> 2<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * 试成批插入数据的事务处理,q回是否成功<br /> 3<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * <br /></span><span style="COLOR: #008080"> 4</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * @param objPO Object<br /></span><span style="COLOR: #008080"> 5</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * @return boolean<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span><br /> 7<img id="Codehighlighter1_149_1523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_1523_Open_Text.style.display='none'; Codehighlighter1_149_1523_Closed_Image.style.display='inline'; Codehighlighter1_149_1523_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_149_1523_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_1523_Closed_Text.style.display='none'; Codehighlighter1_149_1523_Open_Image.style.display='inline'; Codehighlighter1_149_1523_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> insertBatch(</span><span style="COLOR: #0000ff">final</span><span> Object objPO) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isSuccess </span><span style="COLOR: #000000">=</span><span> false;<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        Transaction transaction </span><span style="COLOR: #000000">=</span><span> null;<br /></span><span style="COLOR: #008080">10</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        Session session = openSession();<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id="Codehighlighter1_279_802_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_802_Open_Text.style.display='none'; Codehighlighter1_279_802_Closed_Image.style.display='inline'; Codehighlighter1_279_802_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_279_802_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_802_Closed_Text.style.display='none'; Codehighlighter1_279_802_Open_Image.style.display='inline'; Codehighlighter1_279_802_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">try</span><span> <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">12</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            transaction = session.beginTransaction();<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id="Codehighlighter1_380_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_380_625_Open_Text.style.display='none'; Codehighlighter1_380_625_Closed_Image.style.display='inline'; Codehighlighter1_380_625_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_380_625_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_380_625_Closed_Text.style.display='none'; Codehighlighter1_380_625_Open_Image.style.display='inline'; Codehighlighter1_380_625_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span>) <img src="http://www.aygfsteel.com/images/dot.gif" /><span>{<br />14<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                session.save(objPO);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id="Codehighlighter1_452_611_Open_Image" onclick="this.style.display='none'; Codehighlighter1_452_611_Open_Text.style.display='none'; Codehighlighter1_452_611_Closed_Image.style.display='inline'; Codehighlighter1_452_611_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_452_611_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_452_611_Closed_Text.style.display='none'; Codehighlighter1_452_611_Open_Image.style.display='inline'; Codehighlighter1_452_611_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (i </span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">50</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span>) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    </span><span>// flush a batch of inserts and release memory<br />17</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    session.flush();<br />18<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    session.clear();<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span><br />20</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />21<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            transaction.commit();<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            logger.info(</span><span style="COLOR: #000000">"</span><span>transaction.wasCommitted:"<br />23</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    + transaction.wasCommitted());<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            isSuccess </span><span style="COLOR: #000000">=</span><span> true;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img id="Codehighlighter1_834_1353_Open_Image" onclick="this.style.display='none'; Codehighlighter1_834_1353_Open_Text.style.display='none'; Codehighlighter1_834_1353_Closed_Image.style.display='inline'; Codehighlighter1_834_1353_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_834_1353_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_834_1353_Closed_Text.style.display='none'; Codehighlighter1_834_1353_Open_Image.style.display='inline'; Codehighlighter1_834_1353_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span> catch</span><span> (HibernateException ex) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img id="Codehighlighter1_873_1239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_873_1239_Open_Text.style.display='none'; Codehighlighter1_873_1239_Closed_Image.style.display='inline'; Codehighlighter1_873_1239_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_873_1239_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_873_1239_Closed_Text.style.display='none'; Codehighlighter1_873_1239_Open_Image.style.display='inline'; Codehighlighter1_873_1239_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (transaction </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span>) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id="Codehighlighter1_895_1079_Open_Image" onclick="this.style.display='none'; Codehighlighter1_895_1079_Open_Text.style.display='none'; Codehighlighter1_895_1079_Closed_Image.style.display='inline'; Codehighlighter1_895_1079_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_895_1079_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_895_1079_Closed_Text.style.display='none'; Codehighlighter1_895_1079_Open_Image.style.display='inline'; Codehighlighter1_895_1079_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">try</span><span> <img src="http://www.aygfsteel.com/images/dot.gif" /><span>{<br />28<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    transaction.rollback();<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    logger.error(</span><span style="COLOR: #000000">"</span><span>transaction.wasRolledBack:"<br />30</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                            + transaction.wasRolledBack());<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img id="Codehighlighter1_1112_1225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1112_1225_Open_Text.style.display='none'; Codehighlighter1_1112_1225_Closed_Image.style.display='inline'; Codehighlighter1_1112_1225_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1112_1225_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1112_1225_Closed_Text.style.display='none'; Codehighlighter1_1112_1225_Open_Image.style.display='inline'; Codehighlighter1_1112_1225_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                }</span> catch</span><span> (HibernateException ex1) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span>32<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    logger.error(ex1.getMessage());<br />33<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                    ex1.printStackTrace();<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span><br />35</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />36<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            logger.error(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Insert Batch PO Error:</span><span style="COLOR: #000000">"</span><span> + ex.getMessage());<br />37<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            ex.printStackTrace();<br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id="Codehighlighter1_1363_1491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1363_1491_Open_Text.style.display='none'; Codehighlighter1_1363_1491_Closed_Image.style.display='inline'; Codehighlighter1_1363_1491_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1363_1491_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1363_1491_Closed_Text.style.display='none'; Codehighlighter1_1363_1491_Open_Image.style.display='inline'; Codehighlighter1_1363_1491_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span> finally</span><span> <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img id="Codehighlighter1_1402_1452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1402_1452_Open_Text.style.display='none'; Codehighlighter1_1402_1452_Closed_Image.style.display='inline'; Codehighlighter1_1402_1452_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1402_1452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1402_1452_Closed_Text.style.display='none'; Codehighlighter1_1402_1452_Open_Image.style.display='inline'; Codehighlighter1_1402_1452_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (transaction </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span>) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                transaction </span><span style="COLOR: #000000">=</span><span> null;<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />42<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            session.close();<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span><br />44</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        return isSuccess;<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span><br />46</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />q只是简单的试Q实际项目中遇到的问题,要比q个复杂得多?br />q时候,我们可以让Spring来控制TransactionQ自己来控制Hibernate的SessionQ随时更新数据?/font> <font size="2"> <br />首先Q利用HibernateDaoSupportcL自定义个Ҏ(gu)打开SessionQ?br /></font> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #008080">1</span> <img id="Codehighlighter1_28_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_125_Open_Text.style.display='none'; Codehighlighter1_28_125_Closed_Image.style.display='inline'; Codehighlighter1_28_125_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_28_125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_125_Closed_Text.style.display='none'; Codehighlighter1_28_125_Open_Image.style.display='inline'; Codehighlighter1_28_125_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">public</span> <span> Session openSession()<img src="http://www.aygfsteel.com/images/dot.gif" /><span>{<br />2<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /></span><span style="COLOR: #008080">3</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        return getHibernateTemplate().getSessionFactory().openSession();<br />4<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span> </div>然后Q用打开的Session处理你的数据Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_43_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_282_Open_Text.style.display='none'; Codehighlighter1_43_282_Closed_Image.style.display='inline'; Codehighlighter1_43_282_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_43_282_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_282_Closed_Text.style.display='none'; Codehighlighter1_43_282_Open_Image.style.display='inline'; Codehighlighter1_43_282_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span> doBusiness(Session session) <img src="http://www.aygfsteel.com/images/dot.gif" /><span>{<br /> 2<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_273_Open_Text.style.display='none'; Codehighlighter1_67_273_Closed_Image.style.display='inline'; Codehighlighter1_67_273_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_273_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_273_Closed_Text.style.display='none'; Codehighlighter1_67_273_Open_Image.style.display='inline'; Codehighlighter1_67_273_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">true</span><span>) <img src="http://www.aygfsteel.com/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span>//do your business with the opening session        <br /> 5</span><span><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            someMethod(session);<br /></span><span> 6<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            session.flush();<br /> 7<img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            session.clear();<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            logger.info(</span><span style="COLOR: #000000">"</span><span>good job!");            <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>       <br />10</span><span style="COLOR: #000000"><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></div> <p>每做一ơ数据操作,更CơSessionQ这样可以保证每ơ数据操作都成功Q否则就让SpringL制它r(ji)oll back吧?br /><br />最后,记得关闭Session?br /></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #008080">1</span> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">Session session </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> openSession();<br /></span> <span style="COLOR: #008080">2</span> <span style="COLOR: #000000"> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />doBusiness(session);<br /></span> <span style="COLOR: #008080">3</span> <span style="COLOR: #000000"> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />session.close(); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">关闭session</span> </div> <p> <br />至于处理速度呢,不会(x)慢到哪儿ȝQ已l试验过了? - )<br /><br />q等什么,赶快试试吧!<br /></p> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/93454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-12 15:30 <a href="http://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 深入研究之Criteria(?http://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93427.htmlliaojiyongliaojiyongFri, 12 Jan 2007 06:27:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93427.htmlhttp://www.aygfsteel.com/liaojiyong/comments/93427.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2007/01/12/93427.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/93427.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/93427.html最q在目中?/span> Spring ?/span> Hibernate q行开发,有感?/span> Criteria 比较好用Q在查询Ҏ(gu)设计上可以灵zȝҎ(gu) Criteria 的特Ҏ(gu)方便地进行查询条件的l装。所以现在对 Hibernate ?/span> Criteria 深入研究一下。?/span> Hibernate Reference 》及(qing)|上其它一些资料对 Criteria 已经做了很多介绍。本文主要是?/span> Criteria 的结构入手来q行分析?/span>

       如图 1 ?/span> Hibernate 设计?/span> CriteriaSpecification 作ؓ(f) Criteria 的顶U接口,其下面提供了 Criteria ?/span> DetachedCriteria ?/span>

Criteria ?/span> DetachedCriteria 的主要区别在于创建的形式不一P Criteria 是在U的Q所以它是由 Hibernate Session q行创徏的;?/span> DetachedCriteria 是离U的Q创建时无需 Session Q?/span> DetachedCriteria 提供?/span> 4 个静态方?/span> forClass(Class) ?/span> forEntityName(Name) q行 DetachedCriteria 实例的创建?/span> Spring 的框架提供了

getHibernateTemplate().findByCriteria(detachedCriteria) Ҏ(gu)可以很方便地Ҏ(gu)

DetachedCriteria 来返回查询结果?/span>

如图 1 Q?/span> Criteria ?/span> DetachedCriteria 均可使用 Criterion ?/span> Projection 讄查询条g。可以设|?/span> FetchMode( 联合查询抓取的模?/span> ) Q设|排序方式。对?/span> Criteria q可以设|?/span> FlushModel Q冲?/span> Session 的方式)?/span> LockMode Q数据库锁模式)?/span>

下面对 Criterion ?/span> Projection q行详细说明?/span>

      

?/span> 1

 

       Criterion ?/span> Criteria 的查询条件?/span>

Criteria 提供?/span> add(Criterion criterion) Ҏ(gu)来添加查询条件。图 2 ?/span> Criterion 的结构图?/span> Criterion 接口的主要实现包括:(x) Example ?/span> Junction ?/span> SimpleExpression 。?/span> Junction 的实际用是它的两个子类 conjunction ?/span> disjunction Q分别是使用 AND ?/span> OR 操作W进行来联结查询条g集合?/span>

Criterion 的实例可以通过 Restrictions 工具cL创徏Q?/span> Restrictions 提供了大量的静态方法,?/span> eq Q等于)?/span> ge Q大于等于)?/span> between {来Ҏ(gu)的创?/span> Criterion 查询条g

Q?/span> SimpleExpression 实例Q。除此之外, Restrictions q提供了Ҏ(gu)来创?/span> conjunction ?/span> disjunction 实例Q通过往该实例的 add(Criteria) Ҏ(gu)来增加查询条件Ş成一个查询条仉合?/span>

至于 Example 的创建有所不同Q?/span> Example 本n提供了一个静态方?/span> create(Object entity) Q即Ҏ(gu)一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设|一些过滤条Ӟ(x)

Example exampleUser =Example.create(u)

.ignoreCase() // 忽略大小?/span>

.enableLike(MatchMode.ANYWHERE);

// ?/span> String cd的属性,无论在那里值在那里都匹配。相当于 %value%


?/span> 2

      

Project 主要是让 Criteria 能够q行报表查询Qƈ可以实现分组?/span> Project 主要?/span> SimpleProjection ?/span> ProjectionList ?/span> Property 三个实现。其?/span> SimpleProjection ?/span> ProjectionList 的实例化是由内徏?/span> Projections 来完成,如提供的 avg ?/span> count ?/span> max ?/span> min ?/span> sum 可以让开发者很Ҏ(gu)Ҏ(gu)个字D进行统计查询?/span>

       Property 是对某个字段q行查询条g的设|,如通过

      Porperty.forName(“color?.in(new String[]{“black?”red?”write”}); 则可以创Z?/span> Project 实例。通过 criteria ?/span> add(Project) Ҏ(gu)加入到查询条件中厅R?/span>


?/span> 3

      

       使用 Criteria q行查询Q主要要清晰的是 Hibernate 提供了那些类和方法来满开发中查询条g的创建和l装Q其l构层次如何。这样用v来便可得心应手?/span>



liaojiyong 2007-01-12 14:27 发表评论
]]>
Hibernate 深入研究?Criteria Q{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59843.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 24 Jul 2006 08:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59843.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/59843.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/59843.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/59843.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="postbody"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span> </span> </p> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最q在目中?/span> <span lang="EN-US">Spring</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Hibernate</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行开发,有感?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较好用Q在查询Ҏ(gu)设计上可以灵zȝҎ(gu)</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的特Ҏ(gu)方便地进行查询条件的l装。所以现在对</span> <span lang="EN-US">Hibernate</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">深入研究一下。?/span> <span lang="EN-US">Hibernate Reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">》及(qing)|上其它一些资料对</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经做了很多介绍。本文主要是?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构入手来q行分析?/span> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如图</span> <span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Hibernate</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计?/span> <span lang="EN-US">CriteriaSpecification</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作ؓ(f)</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的顶U接口,其下面提供了</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的主要区别在于创建的形式不一P</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是在U的Q所以它是由</span> <span lang="EN-US">Hibernate Session</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行创徏的;?/span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是离U的Q创建时无需</span> <span lang="EN-US">Session</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供?/span> <span lang="EN-US">4</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个静态方?/span> <span lang="EN-US">forClass(Class)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">forEntityName(Name)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行</span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例的创建?/span> <span lang="EN-US">Spring</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的框架提供了</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">getHibernateTemplate().findByCriteria(detachedCriteria)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ(gu)可以很方便地Ҏ(gu)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来返回查询结果?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如图</span> <span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">DetachedCriteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">均可使用</span> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Projection</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">讄查询条g。可以设|?/span> <span lang="EN-US">FetchMode(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">联合查询抓取的模?/span> <span lang="EN-US">)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q设|排序方式。对?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q可以设|?/span> <span lang="EN-US">FlushModel</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q冲?/span> <span lang="EN-US">Session</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式)?/span> <span lang="EN-US">LockMode</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q数据库锁模式)?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面对</span> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Projection</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行详细说明?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       <img src="http://www.aygfsteel.com/images/blogjava_net/faith/13332/o_Criteria.JPG" /></span> <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"> </v:stroke> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"> </v:f> <v:f eqn="sum @0 1 0"> </v:f> <v:f eqn="sum 0 0 @1"> </v:f> <v:f eqn="prod @2 1 2"> </v:f> <v:f eqn="prod @3 21600 pixelWidth"> </v:f> <v:f eqn="prod @3 21600 pixelHeight"> </v:f> <v:f eqn="sum @0 0 1"> </v:f> <v:f eqn="prod @6 1 2"> </v:f> <v:f eqn="prod @7 21600 pixelWidth"> </v:f> <v:f eqn="sum @8 21600 0"> </v:f> <v:f eqn="prod @7 21600 pixelHeight"> </v:f> <v:f eqn="sum @10 21600 0"> </v:f> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"> </v:path> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?> <o:lock v:ext="edit" aspectratio="t"> </o:lock> </v:shapetype> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">1</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span>Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的查询条件?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供?/span> <span lang="EN-US">add(Criterion criterion)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ(gu)来添加查询条件。图</span> <span lang="EN-US">2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构图?/span> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的主要实现包括:(x)</span> <span lang="EN-US">Example</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Junction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">SimpleExpression</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。?/span> <span lang="EN-US">Junction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实际用是它的两个子类</span> <span lang="EN-US">conjunction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">disjunction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q分别是使用</span> <span lang="EN-US">AND</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">OR</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作W进行来联结查询条g集合?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例可以通过</span> <span lang="EN-US">Restrictions</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具cL创徏Q?/span> <span lang="EN-US">Restrictions</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了大量的静态方法,?/span> <span lang="EN-US">eq</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q等于)?/span> <span lang="EN-US">ge</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q大于等于)?/span> <span lang="EN-US">between</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">{来Ҏ(gu)的创?/span> <span lang="EN-US">Criterion</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询条g</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">SimpleExpression</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例Q。除此之外,</span> <span lang="EN-US">Restrictions</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q提供了Ҏ(gu)来创?/span> <span lang="EN-US">conjunction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">disjunction</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例Q通过往该实例的</span> <span lang="EN-US">add(Criteria)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ(gu)来增加查询条件Ş成一个查询条仉合?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">至于</span> <span lang="EN-US">Example</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的创建有所不同Q?/span> <span lang="EN-US">Example</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本n提供了一个静态方?/span> <span lang="EN-US">create(Object entity)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q即Ҏ(gu)一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设|一些过滤条Ӟ(x)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US">Example exampleUser =Example.create(u)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 126pt"> <span lang="EN-US">.ignoreCase() //</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">忽略大小?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 105pt; TEXT-INDENT: 21pt"> <span lang="EN-US">.enableLike(MatchMode.ANYWHERE);</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 105pt"> <span lang="EN-US">//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">String</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cd的属性,无论在那里值在那里都匹配。相当于</span> <span lang="EN-US">%value%</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <img src="http://www.aygfsteel.com/images/blogjava_net/faith/13332/o_Criterion.JPG" /> <br />?/span> <span lang="EN-US">2</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US">Project </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要是让</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能够q行报表查询Qƈ可以实现分组?/span> <span lang="EN-US">Project</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要?/span> <span lang="EN-US">SimpleProjection</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">ProjectionList</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Property</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三个实现。其?/span> <span lang="EN-US">SimpleProjection</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">ProjectionList</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例化是由内徏?/span> <span lang="EN-US">Projections</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成,如提供的</span> <span lang="EN-US">avg</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">count</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">max</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">min</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">sum</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以让开发者很Ҏ(gu)Ҏ(gu)个字D进行统计查询?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span>Property</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是对某个字段q行查询条g的设|,如通过</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">      </span>Porperty.forName(“color?.in(new String[]{“black?”red?”write”});</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则可以创Z?/span> <span lang="EN-US">Project</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例。通过</span> <span lang="EN-US">criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">add(Project)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ(gu)加入到查询条件中厅R?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <img src="http://www.aygfsteel.com/images/blogjava_net/faith/13332/o_Projection.JPG" /> <br />?/span> <span lang="EN-US">3</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-tab-count: 1">       </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span> <span lang="EN-US">Criteria</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行查询Q主要要清晰的是</span> <span lang="EN-US">Hibernate</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了那些类和方法来满开发中查询条g的创建和l装Q其l构层次如何。这样用v来便可得心应手?/span> </p> </div> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/59843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-24 16:23 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?/8原则指导我们的底层框架设?Q{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/07/21/59314.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 20 Jul 2006 17:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/07/21/59314.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/59314.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/07/21/59314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/59314.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/59314.html</trackback:ping><description><![CDATA[     摘要: 原创文章Q{载请注明作者:(x)NomadQ出处:(x) www.jialing.net      我想很多人都听说q?/8”原则,有h研究q,q世界上财富?0Q集中在20Q的人手里,而另?0Q的人只拥用20Q的财富。实际的商业中,我们应该更关注大客户Q因为客户里20Q的大客PҎ(gu)们A(ch)献的利润可能?x)占?0Q,q些都是有统计学基础的数据。  ?在应用Y件的研发中同样遵守这个原...  <a href='http://www.aygfsteel.com/liaojiyong/archive/2006/07/21/59314.html'>阅读全文</a><img src ="http://www.aygfsteel.com/liaojiyong/aggbug/59314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-21 01:35 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/07/21/59314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank">ʯʨ</a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank">ף</a>| <a href="http://" target="_blank">绯</a>| <a href="http://" target="_blank">Ͷ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ͼľ</a>| <a href="http://" target="_blank">ɰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">żҽ</a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ڽ</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">崨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ѯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽɽ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>