﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-方大帝的JAVA空间-随笔分类-hibernate</title><link>http://www.blogjava.net/fangts/category/28198.html</link><description>JAVA</description><language>zh-cn</language><lastBuildDate>Mon, 20 Jul 2009 22:13:21 GMT</lastBuildDate><pubDate>Mon, 20 Jul 2009 22:13:21 GMT</pubDate><ttl>60</ttl><item><title>Hibernate QBC查询 </title><link>http://www.blogjava.net/fangts/archive/2009/07/19/287342.html</link><dc:creator>方涛升</dc:creator><author>方涛升</author><pubDate>Sun, 19 Jul 2009 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/fangts/archive/2009/07/19/287342.html</guid><wfw:comment>http://www.blogjava.net/fangts/comments/287342.html</wfw:comment><comments>http://www.blogjava.net/fangts/archive/2009/07/19/287342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fangts/comments/commentRss/287342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fangts/services/trackbacks/287342.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-size: 12pt">Hibernate QBC查询 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QBC查询： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QBC查询就是通过使用Hibernate提供的Query By Criteria <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; API来查询对象，这种API封装了SQL语句的动态拼装，对查询提供了更加面向对象的功能接口。我们看下面的示例程序： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Expression.eq(&#8220;name&#8221;,&#8221;zx&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Expression.eq(&#8220;age&#8221;,new Integer(27)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list(); <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当执行criteria.list()时会生成类似这样的SQL语句：Select * from user where name=&#8217;zx&#8217; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age=27;所以在这里我们可以看出，Criteria实际上是一个查询容器，它对查询条件表达式的添加进行了封装，具体的查询条件是通过add()方法添加的，而且具体的查询条件的表达式运算是通过Expression指定的。Hibernate在运行期会根据Criteria指定的表达式条件来添加查询条件，并且生成查询语句。这种方式非常符合Java以及所有面向对象编程语言的编程方式，所以大多数的持久层框架都提供了对这种方式查询的支持。下面我们讲解这种查询方式的各个技术细节。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Criteria查询表达式： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正如我们所见，Expression对查询语句的表达式进行了封装和限制，下表列出了Expression所有的方法，以及每个方法所对应的查询表达式及其限制。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法描述 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="+0">Expression.eq</font>对应SQL的&#8220;field=value&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：Expression.eq(&#8220;name&#8221;,&#8221;zx&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.allEq方法的参数为一个Map类型对象，包含多个名/值对对应关系，相当于多个Expression.eq的叠加 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.gt对应SQL的&#8220;field&gt;value&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.ge对应SQL的&#8220;field&gt;=value&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.lt对应SQL的&#8220;field&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.le对应SQL的&#8220;field&lt;=value&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.between对应SQL语句的between表达式，如：查询年龄在21与27岁之间的用户，可以写成Expression.between(&#8220;age&#8221;,new <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer(21),new Integer(27)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.like对应SQL语句的&#8221;field like value&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.in对应SQL语句的&#8220;field in(&#8230;&#8230;)&#8221;表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.eqProperty用于比较两个属性值，对应&#8221;field=field&#8221;SQL表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.gtProperty用于比较两个属性值，对应&#8221;field&gt;field&#8221;SQL表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.geProperty用于比较两个属性值，对应&#8221;field&gt;=field&#8221;SQL表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.ltProperty用于比较两个属性值，对应&#8221;field表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.leProperty用于比较两个属性值，对应&#8221;field&lt;=field&#8221;SQL表达式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.and对应SQL语句的And关系组合，如：Expression.and(Expression.eq(&#8220;name&#8221;,&#8221;zx&#8221;),Expression.eq(&#8220;sex&#8221;,&#8221;1&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.or对应SQL语句的Or关系组合，如：Expression.or(Expression.eq(&#8220;name&#8221;,&#8221;zx&#8221;),Expression.eq(&#8220;name&#8221;,&#8221;zhaoxin&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expression.sql作为补充这个方法提供了原生SQL语句查询的支持，在执行时直接通过原生SQL语句进行限定，如：Expression.sql(&#8220;lower({alias}.name) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; like (?)&#8221;,&#8220;zhao%&#8221;,Hibernate.STRING) ;在运行时{ alias <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }将会由当前查询所关联的实体类名替换，()中的?将会由&#8221;zhao%&#8221;替换，并且类型由Hibernate.STRING指定。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：Expression各方法中的属性参数（各方法中的第一个参数）所指定的属性名称（如：name,sex），并不是数据库表中的实际字段名称，而是实体对象中映射实际数据表字段的类属性名称。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、示例查询： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例查询是通过Example类来完成的，Example类实现了Criterion接口，可以用作Criteria查询条件，Example类的作用是：根据已有对象，查询属性值与之相同的其他对象。如下代码所示： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User exampleuser=new User(&#8220;zx&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Example.create(exampleuser)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=(User)list.get(i); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(user.getName()+&#8221;\n&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上述代码中User exampleuser=new <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User(&#8220;zx&#8221;);criteria.add(Example.create(exampleuser));两句相当于 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Expression.eq(&#8220;name&#8221;,&#8221;zx&#8221;));因此会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from user where name=&#8217;zx&#8217;;在上面的代码中exampleuser称为示例对象。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Hibernate中队示例查询，默认情况下会排除掉示例对象中属性值为空的属性，还可以调用Example.excludeNone（排除空串值）/excludeZeros（排除零值），或者调用Example.excludeProperty方法来指定排除特定属性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例查询主要应用于组合查询中，比如根据用户输入的查询条件动态生成最终的查询语句，通过使用示例查询，可以避免由于查询条件过多而写的大量if判断语句。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、复合查询： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复合查询主要是处理，具有关联关系的两个实体怎样进行关联查询，比如User实体对象与Addres实体对象具有一对多的关联关系，我们可以如下构造符合查询： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ffff"> Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria addcriteria=criteria.createCriteria(&#8220;addresses&#8221;);(1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addcriteria.add(Express.like(&#8220;address&#8221;,&#8221;%tianjin%&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=(User)list.get(i); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(user.getName()+&#8221;\n&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set addresses=user.getAddresses(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=addresses.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Address address=(Address)it.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(address.getAddress()+&#8221;\n&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当执行到了（1）处时，表明要针对User对象的addresses属性添加新的查询条件，因此当执行criteria.list()时，Hibernate会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select * from user inner join address on user.id=address.id where <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address.address like &#8216;%shanghai%&#8217;; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正如我们所见，我们可以通过向Criteria中添加保存关联对象的集合属性（addresses属性保存与User对象相关联的Address对象），来构造复合查询，在数据库一端是通过内连接查询来实现。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、Criteria的高级特性： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A、限定返回记录条数： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以通过利用Criteria.setFirstResult/setMaxResult方法来限定返回某一次查询的记录数，如下代码： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.setFirstResult(100); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.setMaxResult(200); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过以上代码可以设定该次查询返回user表中的从第100条记录开始直到第200条记录结束的100条记录。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B、对查询结果进行排序： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可通过使用net.sf.hibernate.expression.Order类可以对查询结果集进行排序，如下面代码： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Expression.eq(&#8220;groupid&#8221;,&#8221;2&#8221;); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.addOrder(Order.asc(&#8220;name&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.addOrder(Order.desc(&#8220;groupid&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list();</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过使用Order类的asc()/desc()方法，可以指定针对某个字段的排序逻辑，如果执行上述代码，会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select * from user where groupid=&#8217;2&#8217; order by name asc,groupid desc <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C、分组与统计： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Hibernate3中，对Criteria又增添了新功能，可以支持分组与统计功能，在Hibernate3中增加了Projections以及ProjectionList类，这两个类对分组与统计功能进行了封装，如下代码： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.setProjection(Projections.groupProperty(&#8220;age&#8221;));(1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=list.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(it.next()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过（1）处的代码，我们通过Projections类指定了用于分组的目标属性，当进行检索时Hibernate会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select age from user group by age; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还可以通过使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法来实现统计功能，如下面的代码示例： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.setProjection(Projections.avg(&#8220;age&#8221;));(1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=list.iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(it.next()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过（1）处的代码，我们实现了对用户平均年龄的统计，当进行检索时，Hibernate会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select avg(age) from user; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，在SQL语句中的多条件分组与统计功能，可以利用ProjectionList类来实现，如下面代码所示： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProjectionList prolist=Projections.projectionList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prolist.add(Projections.groupProperty(&#8220;age&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prolist.add(Projections.rowCount()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.setProjection(prolist); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list();</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过以上代码，实现了对不同年龄人员数量的分组统计，当进行检索时，Hibernate会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select age,count(*) from user group by age; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、DetachedCriteria: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Hibernate2中，Criteria实例是与创建它的Session实例具有相同的生命周期的，也就是说，Session实例是它所创建的Criteria实例的宿主，当Session关闭时，寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难，为了实现Criteria实例的重用，在Hibernate3中提供了一个DetachedCriteria类，DetachedCriteria实例的生命周期与Session实例的生命周期无关，我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离，当需要进行检索时再与Session实例关联，从而获得运行期的Criteria实例。如下面的代码所示： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">DetachedCriteria dc= DetachedCriteria.forClass(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.add(Expression.eq(&#8220;name&#8221;,&#8221;zhaoxin&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.add(Expression.eq(&#8220;sex&#8221;,&#8221;1&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria=dc.getExecutableCriteria(session); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=criteria.list().iterator(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=(User)it.next(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(user.getName()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正如我们所见，DetachedCriteria的生存周期与session实例无关，当需要进行检索时，通过getExecutableCriteria(session)方法，与当前的Session实例关联并获得运行期的Criteria实例，完成检索。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DetachedCriteria也可以用于完成子查询功能，如下代码所示： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#00ffff">DetachedCriteria dc= DetachedCriteria.forClass(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.setProjection(Projections.avg(&#8220;age&#8221;)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria=session.createCriteria(User.class); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria.add(Subqueries.propertyGt(&#8220;age&#8221;,dc)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list=criteria.list();</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过Subqueries类，实现了添加子查询的功能，我们将DetachedCriteria所设定的查询条件，当作子查询添加到了运行时Criteria实例的查询条件中，当执行检索时Hibernate会生成类似如下的SQL语句： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"> Select * from user where age&gt;(select avg(age) from user group by <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age);</font> </span></span>
<img src ="http://www.blogjava.net/fangts/aggbug/287342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fangts/" target="_blank">方涛升</a> 2009-07-19 16:12 <a href="http://www.blogjava.net/fangts/archive/2009/07/19/287342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用hibernate search增量索引</title><link>http://www.blogjava.net/fangts/archive/2008/01/09/174020.html</link><dc:creator>方涛升</dc:creator><author>方涛升</author><pubDate>Wed, 09 Jan 2008 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/fangts/archive/2008/01/09/174020.html</guid><wfw:comment>http://www.blogjava.net/fangts/comments/174020.html</wfw:comment><comments>http://www.blogjava.net/fangts/archive/2008/01/09/174020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fangts/comments/commentRss/174020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fangts/services/trackbacks/174020.html</trackback:ping><description><![CDATA[1、创建POJO<br />
<p>package cn.search.pojo;</p>
<p>import java.io.Serializable;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.Id;<br />
import javax.persistence.Table;</p>
<p>import org.hibernate.annotations.Cache;<br />
import org.hibernate.annotations.CacheConcurrencyStrategy;<br />
import org.hibernate.search.annotations.DocumentId;<br />
import org.hibernate.search.annotations.Field;<br />
import org.hibernate.search.annotations.Index;<br />
import org.hibernate.search.annotations.Indexed;<br />
import org.hibernate.search.annotations.Store;</p>
<p>@Entity<br />
@Table(name = "search_foo")<br />
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)<br />
@Indexed(index = "search_foo")<br />
public class Foo implements Serializable {</p>
<p>&nbsp;/**<br />
&nbsp; * <br />
&nbsp; */<br />
&nbsp;private static final long serialVersionUID = 1L;<br />
&nbsp;@Id<br />
&nbsp;@DocumentId<br />
&nbsp;@Field(name = "id", index = Index.TOKENIZED, store = Store.YES)<br />
&nbsp;private Integer id;</p>
<p>&nbsp;@Column(nullable = false, length = 200)<br />
&nbsp;@Field(name = "name", index = Index.TOKENIZED, store = Store.YES)<br />
&nbsp;private String name;</p>
<p>&nbsp;@Column(nullable = false, length = 200)<br />
&nbsp;@Field(name = "title", index = Index.TOKENIZED, store = Store.YES)<br />
&nbsp;private String title;</p>
<p>&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>&nbsp;public String getTitle() {<br />
&nbsp;&nbsp;return title;<br />
&nbsp;}</p>
<p>&nbsp;public void setTitle(String title) {<br />
&nbsp;&nbsp;this.title = title;<br />
&nbsp;}<br />
}<br />
</p>
2、配置文件<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" &gt;<br />
&lt;hibernate-configuration&gt;<br />
&nbsp;&lt;session-factory&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.dialect"&gt;<br />
&nbsp;&nbsp;&nbsp;org.hibernate.dialect.Oracle9Dialect<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.connection.url"&gt;<br />
&nbsp;&nbsp;&nbsp;jdbc:oracle:thin:@192.168.0.21:1521:oradb<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.connection.username"&gt;<br />
&nbsp;&nbsp;&nbsp;goodsres<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.connection.password"&gt;<br />
&nbsp;&nbsp;&nbsp;goodsres<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.connection.driver_class"&gt;<br />
&nbsp;&nbsp;&nbsp;oracle.jdbc.driver.OracleDriver<br />
&nbsp;&nbsp;&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&lt;property name="hibernate.search.default.directory_provider"&gt;<br />
&nbsp;&nbsp;&nbsp;org.hibernate.search.store.FSDirectoryProvider<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.search.default.indexBase"&gt;<br />
&nbsp;&nbsp;&nbsp;e:/index<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernate.cache.provider_class"&gt;<br />
&nbsp;&nbsp;&nbsp;org.hibernate.cache.HashtableCacheProvider<br />
&nbsp;&nbsp;&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&lt;mapping class="cn.search.pojo.Foo" /&gt;</p>
<p>&nbsp;&lt;/session-factory&gt;</p>
<p>&lt;/hibernate-configuration&gt;<br />
3、测试代码<br />
</p>
<p>package cn.search.manager;</p>
<p>import static junit.framework.Assert.assertNotNull;<br />
import static junit.framework.Assert.assertTrue;</p>
<p>import java.util.List;</p>
<p>import org.apache.lucene.analysis.StopAnalyzer;<br />
import org.apache.lucene.queryParser.QueryParser;<br />
import org.hibernate.Query;<br />
import org.hibernate.Session;<br />
import org.hibernate.SessionFactory;<br />
import org.hibernate.Transaction;<br />
import org.hibernate.cfg.AnnotationConfiguration;<br />
import org.hibernate.search.FullTextSession;<br />
import org.hibernate.search.Search;<br />
import org.junit.After;<br />
import org.junit.Before;<br />
import org.junit.BeforeClass;<br />
import org.junit.Test;</p>
<p><br />
import cn.search.pojo.Foo;</p>
<p>public class SearchResultsHibernate {<br />
&nbsp;private static SessionFactory sf = null;</p>
<p>&nbsp;private static Session session = null;</p>
<p>&nbsp;private static Transaction tx = null;</p>
<p>&nbsp;@BeforeClass<br />
&nbsp;public static void setupBeforeClass() throws Exception {<br />
&nbsp;&nbsp;sf = new AnnotationConfiguration().configure("hibernate.cfg.xml")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.buildSessionFactory();<br />
&nbsp;&nbsp;assertNotNull(sf);<br />
&nbsp;}</p>
<p>&nbsp;@Before<br />
&nbsp;public void setUp() throws Exception {<br />
&nbsp;&nbsp;session = sf.openSession();<br />
&nbsp;&nbsp;tx = session.beginTransaction();<br />
&nbsp;&nbsp;tx.begin();<br />
&nbsp;}</p>
<p>&nbsp;@After<br />
&nbsp;public void tearDown() throws Exception {<br />
&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;session.close();<br />
&nbsp;}</p>
<p>&nbsp;public static void tearDownAfterClass() throws Exception {<br />
&nbsp;&nbsp;if (sf != null)<br />
&nbsp;&nbsp;&nbsp;sf.close();<br />
&nbsp;}</p>
<p>&nbsp;@Test<br />
&nbsp;public void testAddDept() throws Exception {<br />
&nbsp;&nbsp;Foo foo = new Foo();</p>
<p>&nbsp;&nbsp;foo.setId(1);</p>
<p>&nbsp;&nbsp;foo.setName("第一个hibernate search");</p>
<p>&nbsp;&nbsp;foo.setTitle("好好学习，天天向上");</p>
<p>&nbsp;&nbsp;session.delete(foo);<br />
&nbsp;}</p>
<p>&nbsp;@Test<br />
&nbsp;public void testIndex() throws Exception {<br />
&nbsp;&nbsp;FullTextSession fullTextSession = Search.createFullTextSession(session);<br />
&nbsp;&nbsp;assertNotNull(session);</p>
<p>&nbsp;&nbsp;QueryParser parser = new QueryParser("title", new StopAnalyzer());<br />
&nbsp;&nbsp;org.apache.lucene.search.Query luceneQuery = parser.parse("好好学习");<br />
&nbsp;&nbsp;Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery,<br />
&nbsp;&nbsp;&nbsp;&nbsp;Foo.class);</p>
<p>&nbsp;&nbsp;List list = hibQuery.list();</p>
<p>&nbsp;&nbsp;assertTrue(list.size() &gt; 0);<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;setupBeforeClass();<br />
&nbsp;&nbsp;&nbsp;SearchResultsHibernate searchResults = new SearchResultsHibernate();<br />
&nbsp;&nbsp;&nbsp;searchResults.setUp();<br />
&nbsp;&nbsp;&nbsp;searchResults.testAddDept();<br />
&nbsp;&nbsp;&nbsp;searchResults.tearDown();<br />
&nbsp;&nbsp;&nbsp;SearchResultsHibernate.tearDownAfterClass();</p>
<p>&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/fangts/aggbug/174020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fangts/" target="_blank">方涛升</a> 2008-01-09 15:14 <a href="http://www.blogjava.net/fangts/archive/2008/01/09/174020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate+spring整合</title><link>http://www.blogjava.net/fangts/archive/2007/12/20/168929.html</link><dc:creator>方涛升</dc:creator><author>方涛升</author><pubDate>Thu, 20 Dec 2007 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/fangts/archive/2007/12/20/168929.html</guid><wfw:comment>http://www.blogjava.net/fangts/comments/168929.html</wfw:comment><comments>http://www.blogjava.net/fangts/archive/2007/12/20/168929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fangts/comments/commentRss/168929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fangts/services/trackbacks/168929.html</trackback:ping><description><![CDATA[<p>Spring Framework最得以出名的是与Hibernate的无缝链接，基本上用Spring，就会用Hibernate。可惜的是Spring提供的HibernateTemplate功能显得不够，使用起来也不是很方便。我们编程序时，一般先写BusinessService，由BusinessService调DAO来执行存储，在这方面Spring没有很好的例子，造成真正想用好它，并不容易。</p>
<p>我们的思路是先写一个BaseDao，仿照HibernateTemplate，将基本功能全部实现：</p>
<p>public class BaseDao extends HibernateDaoSupport{</p>
<p>&nbsp;&nbsp;&nbsp; private Log log = LogFactory.getLog(getClass());</p>
<p>&nbsp;&nbsp;&nbsp; public Session openSession() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SessionFactoryUtils.getSession(getSessionFactory(), false);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Object get(Class entityClass, Serializable id) throws DataAccessException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return session.get(entityClass, id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (HibernateException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw SessionFactoryUtils.convertHibernateAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Serializable create(Object entity) throws DataAccessException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return session.save(entity);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (HibernateException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw SessionFactoryUtils.convertHibernateAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>...</p>
<p>其它的DAO，从BaseDao继承出来，这样写其他的DAO，代码就会很少。</p>
<p>从BaseDao继承出来EntityDao，专门负责一般实体的基本操作，会更方便。</p>
<p>public interface EntityDao {</p>
<p>&nbsp;&nbsp;&nbsp; public Object get(Class entityClass, Serializable id) throws DataAccessException;</p>
<p>&nbsp;&nbsp;&nbsp; public Object load(Class entityClass, Serializable id) throws DataAccessException;</p>
<p>&nbsp;&nbsp;&nbsp; public Serializable create(Object entity) throws DataAccessException;<br />
...}</p>
<p>/**<br />
&nbsp;* Base class for Hibernate DAOs.&nbsp; This class defines common CRUD methods for<br />
&nbsp;* child classes to inherit. User Sping AOP Inteceptor<br />
&nbsp;*/<br />
public class EntityDaoImpl extends BaseDao implements EntityDao{</p>
<p>}</p>
<p>为了Transaction的控制，采用AOP的方式：</p>
<p>public interface EntityManager {</p>
<p>&nbsp;&nbsp;&nbsp; public Object get(Class entityClass, Serializable id);</p>
<p>&nbsp;&nbsp;&nbsp; public Object load(Class entityClass, Serializable id);</p>
<p>&nbsp;&nbsp;&nbsp; public Serializable create(Object entity);<br />
...</p>
<p>}</p>
<p>/**<br />
&nbsp;* Base class for Entity Service. User Sping AOP Inteceptor<br />
&nbsp;*/<br />
public class EntityManagerImpl implements EntityManager {</p>
<p>&nbsp;&nbsp;&nbsp; private EntityDao entityDao;</p>
<p>&nbsp;&nbsp;&nbsp; public void setEntityDao(EntityDao entityDao) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.entityDao = entityDao;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Object get(Class entityClass, Serializable id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return entityDao.get(entityClass, id);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Object load(Class entityClass, Serializable id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return entityDao.load(entityClass, id);<br />
&nbsp;&nbsp;&nbsp; }<br />
...</p>
<p>}</p>
<p>这样我们就有了一个通用的Hibernate实体引擎，可以对任何Hibernate实体实现基本的增加、修改、删除、查询等。</p>
<p>其它的BusinessService就可以继承EntityManager，快速实现业务逻辑。</p>
<p>具体XML配置如下：</p>
<p>&nbsp;&lt;!-- Oracle JNDI DataSource for J2EE environments --&gt;<br />
&nbsp;&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="jndiName"&gt;&lt;value&gt;java:comp/env/jdbc/testPool&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- Hibernate SessionFactory for Oracle --&gt;<br />
&nbsp;&lt;!-- Choose the dialect that matches your "dataSource" definition --&gt;<br />
&nbsp;&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;user-hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;net.sf.hibernate.dialect.OracleDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.cache.provider_class"&gt;net.sf.ehcache.hibernate.Provider&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.cache.use_query_cache"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql"&gt;false&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- AOP DAO Intecepter --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="proxyInterfaces"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.gpower.services.entity.dao.EntityDao&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="interceptorNames"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;hibernateInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;entityDaoTarget&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --&gt;<br />
&nbsp;&lt;bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) --&gt;<br />
&nbsp;&lt;!--<br />
&nbsp;&lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;<br />
&nbsp;--&gt;</p>
<p>&nbsp;&lt;!-- Transactional proxy for the Application primary business object --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="entityDao"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="entityDao"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionManager"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="entityManagerTarget"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributes"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="get*"&gt;PROPAGATION_SUPPORTS&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
</p>
    <img src ="http://www.blogjava.net/fangts/aggbug/168929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fangts/" target="_blank">方涛升</a> 2007-12-20 09:28 <a href="http://www.blogjava.net/fangts/archive/2007/12/20/168929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>