随笔-124  评论-49  文章-56  trackbacks-0
 
     摘要: 1111-1234 re \d{5}(-\d{4})? ?指前面的子项可有可无 11111 re (\d)\1{4} 1221 re (\d)(\d)\2\1 RegExp对象 创建方式: 1 使用RegExp对象显式构造函数new RegExp("pattern"[,"flags"]) 2 使用RegExp对象隐式构造函数/pattern/[flags] flags参数 g 用...  阅读全文
posted @ 2009-11-04 14:42 junly 阅读(227) | 评论 (0)编辑 收藏

 大清早struts2的配置文件报错The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action


意思是我在配置文件中:
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(就是所有的action放到最后)
的顺序有问题,仔细检查了一遍也没发现有什么错误,想想是不是action里面的顺序有问题,(action里面的顺序是可以任意放的)最终刷新了一下页
面好了,是IDE在作怪吧,记录一下,以防下次再遇到。
posted @ 2009-11-04 09:31 junly 阅读(2598) | 评论 (0)编辑 收藏
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;


public class Test {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Configuration cfg
=new Configuration().configure();
        SchemaExport export
=new SchemaExport(cfg);
        export.create(
truetrue);
    }


}

posted @ 2009-11-03 17:57 junly 阅读(245) | 评论 (0)编辑 收藏
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
  
<session-factory>
      
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
      
<property name="connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=epai</property>
      
<property name="connection.username">sa</property>
      
<property name="connection.password">accp</property>
      
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
      
<property name="hibernate.show_sql">true</property>
      
<property name="hibernate.hbm2ddl.auto">update</property>
      
<property name="hibernate.current_session_context_class">thread</property>
      
    
<!-- 
        <property name="hibernate.current_session_context_class">jta</property>
     
-->
      
      
<mapping resource="org/epai/entity/Users.hbm.xml"/>
      
<mapping resource="org/epai/entity/Goods.hbm.xml"/>
      
<mapping resource="org/epai/entity/Bid.hbm.xml"/>
  
</session-factory>
</hibernate-configuration>
posted @ 2009-11-03 17:56 junly 阅读(238) | 评论 (0)编辑 收藏
 

HQL运算符

QBC运算符

含义

=

Restrictions.eq()

等于equal

<> 

Restrictions.ne()

不等于not equal

> 

Restrictions.gt()

大于greater than

>=

Restrictions.ge()

大于等于greater than or equal

< 

Restrictions.lt()

小于less than

<=

Restrictions.le()

小于等于less than or equal

is null

Restrictions.isnull()

等于空值

is not null

Restrictions.isNotNull()

非空值

like

Restrictions.like()

字符串模式匹配

and

Restrictions.and()

逻辑与

and

Restrictions.conjunction()

逻辑与

or

Restrictions.or()

逻辑或

or

Restrictions.disjunction()

逻辑或

not

Restrictions.not()

逻辑非

in(列表)

Restrictions.in()

等于列表中的某一个值

not in(列表)

Restrictions.not(Restrictions.in())

不等于列表中任意一个值

between x and y

Restrictions.between()

闭区间xy中的任意值

not between x and y

Restrictions.not(Restrictions..between())

小于值X或者大于值y

//获取记录总数
recordCount=Convert.ToInt32(criteria.SetProjection( Projections.Count(MovieUrl.__ID )) .UniqueResult(  ));

criteria.SetProjection( 
null );

Criteria c
=session.createCriteria(Book.class);

c.add(Restrictions.like(
"bookname""a",MatchMode.ANYWHERE));

c.add(Restrictions.between(
"bid"13));

c.add(Restrictions.not(Restrictions.in(
"bid"new Integer[]{1,2,4})));

c.setFirstResult(
0);     

c.setMaxResults(
2);    

List list
=c.list();

Restrictions.like(“”,…,MatchMode.ANYWHERE)

AddOrder(Order.asc(“fwid”))

在oracle数据库中,如果使用Restrictions.ne("name","张三"),不会包括该字段值为空的记录
posted @ 2009-11-03 17:46 junly 阅读(5092) | 评论 (0)编辑 收藏
junit简介:
 * 创建test目录与src同级,同时建立相同的包目录
 * 编写测试类xxxTest,需要继承TestCase
 * 编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
   public void testHello(){}
 * 最好单元测试的代码单独建立一个目录
 * 断言
   this.assertEquals("消息",2,hello.add(1,1));
 * protected void setUp() throws exception{}//相当于init方法,可以自动调用
posted @ 2009-11-03 17:44 junly 阅读(188) | 评论 (0)编辑 收藏
jdbc:mysql://127.0.0.1:3306/test_hibernate2?useUnicode=true&amp;characterEncoding=UTF-8
posted @ 2009-11-03 17:43 junly 阅读(167) | 评论 (0)编辑 收藏

org.hibernate.criterion.DetachedCriteria的用法

一 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。
   1 Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所
以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name)
进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。
   2 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设
置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel
(冲刷 Session 的方式)和 LockMode (数据库锁模式)。
二 下面对 Criterion 和 Projection 进行详细说明:
   1 Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来
添加查询条件。
   2 Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而
Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 AND 和 OR 操
作符进行来联结查询条件集合。
   3 Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态
方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件
(SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 conjunction 和
disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合。
   4 至于 Example 的创建有所不同, Example 本身提供了一个静态方法 create(Object entity),
即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件:
Example exampleUser =Example.create(u).ignoreCase() // 忽略大小写
                                      .enableLike(MatchMode.ANYWHERE);
           // 对 String 类型的属性,无论在那里值在那里都匹配。相当于 %value%
   5 Project 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Project 主要有
SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和
ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg 、 count 、 max 、
min 、 sum 可以让开发者很容易对某个字段进行统计查询。
   6 Property 是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”).in
(new String[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过
criteria 的 add(Project) 方法加入到查询条件中去。
   使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查
询条件的创建和组装,下面介绍几种用法:
   1. 创建一个Criteria 实例
   org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
   Criteria crit = sess.createCriteria(Cat.class);
   crit.setMaxResults(50);
   List cats = crit.list();
 
   2. 限制结果集内容
   一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。
   org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。

   List cats = sess.createCriteria(Cat.class)
                   .add( Restrictions.like("name", "Fritz%") )
                   .add( Restrictions.between("weight", minWeight, maxWeight) )
                   .list();

   约束可以按逻辑分组。

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.like("name", "Fritz%") )

    .add( Restrictions.or(

        Restrictions.eq( "age", new Integer(0) ),

        Restrictions.isNull("age")

    ) )

    .list();

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )

    .add( Restrictions.disjunction()

        .add( Restrictions.isNull("age") )

        .add( Restrictions.eq("age", new Integer(0) ) )

        .add( Restrictions.eq("age", new Integer(1) ) )

        .add( Restrictions.eq("age", new Integer(2) ) )

    ) )

    .list();

 

Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许

你直接使用SQL。

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",

Hibernate.STRING) )

    .list();

 

{alias}占位符应当被替换为被查询实体的列别名。

Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个

Property。

 

  Property age = Property.forName("age");

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.disjunction()

        .add( age.isNull() )

        .add( age.eq( new Integer(0) ) )

        .add( age.eq( new Integer(1) ) )

        .add( age.eq( new Integer(2) ) )

    ) )

    .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )

    .list();

 

3. 结果集排序

你可以使用org.hibernate.criterion.Order来为查询结果排序。

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.like("name", "F%")

    .addOrder( Order.asc("name") )

    .addOrder( Order.desc("age") )

    .setMaxResults(50)

    .list();

 

List cats = sess.createCriteria(Cat.class)

    .add( Property.forName("name").like("F%") )

    .addOrder( Property.forName("name").asc() )

    .addOrder( Property.forName("age").desc() )

    .setMaxResults(50)

    .list();

 

4. 关联

你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.like("name", "F%")

    .createCriteria("kittens")

        .add( Restrictions.like("name", "F%")

    .list();

 

注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。

接下来,替换形态在某些情况下也是很有用的。

 

List cats = sess.createCriteria(Cat.class)

    .createAlias("kittens", "kt")

    .createAlias("mate", "mt")

    .add( Restrictions.eqProperty("kt.name", "mt.name") )

    .list();

 

(createAlias()并不创建一个新的 Criteria实例。)

Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得

符合条件的kittens, 你必须使用returnMaps()。

 

List cats = sess.createCriteria(Cat.class)

    .createCriteria("kittens", "kt")

    .add( Restrictions.eq("name", "F%") )

    .returnMaps()

    .list();

Iterator iter = cats.iterator();

while ( iter.hasNext() ) {

    Map map = (Map) iter.next();

    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);

    Cat kitten = (Cat) map.get("kt");

}

5. 动态关联抓取

你可以使用setFetchMode()在运行时定义动态关联抓取的语义。

 

List cats = sess.createCriteria(Cat.class)

    .add( Restrictions.like("name", "Fritz%") )

    .setFetchMode("mate", FetchMode.EAGER)

    .setFetchMode("kittens", FetchMode.EAGER)

    .list();

 

这个查询可以通过外连接抓取mate和kittens。

 

6. 查询示例

org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。

 

Cat cat = new Cat();

cat.setSex('F');

cat.setColor(Color.BLACK);

List results = session.createCriteria(Cat.class)

    .add( Example.create(cat) )

    .list();

 

版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。

可以自行调整Example使之更实用。

 

Example example = Example.create(cat)

    .excludeZeroes()           //exclude zero valued properties

    .excludeProperty("color")  //exclude the property named "color"

    .ignoreCase()              //perform case insensitive string comparisons

    .enableLike();             //use like for string comparisons

List results = session.createCriteria(Cat.class)

    .add(example)

    .list();

 

甚至可以使用examples在关联对象上放置条件。

 

List results = session.createCriteria(Cat.class)

    .add( Example.create(cat) )

    .createCriteria("mate")

        .add( Example.create( cat.getMate() ) )

    .list();

 

7. 投影(Projections)、聚合(aggregation)和分组(grouping)

org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用

setProjection()应用投影到一个查询。

 

List results = session.createCriteria(Cat.class)

    .setProjection( Projections.rowCount() )

    .add( Restrictions.eq("color", Color.BLACK) )

    .list();

 

List results = session.createCriteria(Cat.class)

    .setProjection( Projections.projectionList()

        .add( Projections.rowCount() )

        .add( Projections.avg("weight") )

        .add( Projections.max("weight") )

        .add( Projections.groupProperty("color") )

    )

    .list();



在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他

们也出现在SQL的group by子句中。

可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的

实现方式:

 

List results = session.createCriteria(Cat.class)

    .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )

    .addOrder( Order.asc("colr") )

    .list();

 



List results = session.createCriteria(Cat.class)

    .setProjection( Projections.groupProperty("color").as("colr") )

    .addOrder( Order.asc("colr") )

    .list();

 

alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,

当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:

 

List results = session.createCriteria(Cat.class)

    .setProjection( Projections.projectionList()

        .add( Projections.rowCount(), "catCountByColor" )

        .add( Projections.avg("weight"), "avgWeight" )

        .add( Projections.max("weight"), "maxWeight" )

        .add( Projections.groupProperty("color"), "color" )

    )

    .addOrder( Order.desc("catCountByColor") )

    .addOrder( Order.desc("avgWeight") )

    .list();

 

List results = session.createCriteria(Domestic.class, "cat")

    .createAlias("kittens", "kit")

    .setProjection( Projections.projectionList()

        .add( Projections.property("cat.name"), "catName" )

        .add( Projections.property("kit.name"), "kitName" )

    )

    .addOrder( Order.asc("catName") )

    .addOrder( Order.asc("kitName") )

    .list();

 

也可以使用Property.forName()来表示投影:

 

List results = session.createCriteria(Cat.class)

    .setProjection( Property.forName("name") )

    .add( Property.forName("color").eq(Color.BLACK) )

    .list();

List results = session.createCriteria(Cat.class)

    .setProjection( Projections.projectionList()

        .add( Projections.rowCount().as("catCountByColor") )

        .add( Property.forName("weight").avg().as("avgWeight") )

        .add( Property.forName("weight").max().as("maxWeight") )

        .add( Property.forName("color").group().as("color" )

    )

    .addOrder( Order.desc("catCountByColor") )

    .addOrder( Order.desc("avgWeight") )

    .list();

 

8. 离线(detached)查询和子查询

   在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧!

DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来

执行它。

 

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

    .add( Property.forName("sex").eq('F') );

//创建一个Session

Session session = .;

Transaction txn = session.beginTransaction();

List results = query.getExecutableCriteria(session).setMaxResults(100).list();

txn.commit();

session.close();

 

DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者

Property获得。

 

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)

    .setProjection( Property.forName("weight").avg() );

session.createCriteria(Cat.class)

    .add( Property.forName("weight).gt(avgWeight) )

    .list();

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)

    .setProjection( Property.forName("weight") );

session.createCriteria(Cat.class)

    .add( Subqueries.geAll("weight", weights) )

    .list();

相互关联的子查询也是有可能的:

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")

    .setProjection( Property.forName("weight").avg() )

    .add( Property.forName("cat2.sex").eqProperty("cat.sex") );

session.createCriteria(Cat.class, "cat")

    .add( Property.forName("weight).gt(avgWeightForSex) )

    .list();


例子
public List findAllByCriter(final DetachedCriteria detachedCriteria){
 return (List)getHibernateTemplate().execute(new HibernateCallback(){
  public Object doInHibernate(Session session)
   throws HibernateException{
   Criteria criteria=detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 });
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kjfcpua/archive/2009/06/21/4287248.aspx
-----------------------------------------------------------------------------------------
Hibernate一直都认为比较简单 就那么影射一下:)但最近项目当中遇见很多问题,今天看见别人在项目当中使用了 Hibernate3的DetachedCriteria,感觉真的是太好了,于是就花了点时间研究了一下,希望和大家分享一下吧
  针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句。这里的一个难点是条件列表用什么来构造?传统上使用Map,但是这种方式缺陷很大,Map可以传递的信息非常有限,只能传递name和 value,无法传递究竟要做怎样的条件运算,究竟是大于,小于,like,还是其它的什么,业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必须相应修改,但是这种查询条件的改变是隐式约定的,而不是程序代码约束的,因此非常容易出错。

  DetachedCriteria可以解决这个问题,即在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个 DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧!

  示例代码片段如下:

  web层程序构造查询条件:

  Java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));

  Department和Employee是一对多关联,查询条件为:

  名称是“department”开发部门;
  部门里面的雇员年龄大于20岁;

  业务层对象使用该条件执行查询:

  java代码: detachedCriteria.getExecutableCriteria(session).list();
  最大的意义在于,业务层代码是固定不变的,所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四海而皆准,都无须修改了。

  然而Spring和Hibernate3的DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意:

  Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:

  java代码:
HibernateTemplate.execute(new HibernateCallback() {
 public Object doInHibernate(Session session) throws HibernateException {
  ....
 }
}
  回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下:

  web层代码:

  java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);
  构造detachedCriteria,作为参数传递给departmentManager

  业务层代码使用spring,DepartmentManager的findByCriteria如下:

  java代码:

public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 });
}
  实际上也就是:

  java代码:
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
  而已

  但是该程序代码执行,会抛出强制类型转换异常!

  我跟踪了一下spring和Hibernate源代码,原因如下:

  spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下, HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是 SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,HibernateTemplate的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。

  java代码:
private boolean exposeNativeSession = false;
...
  execute方法内部:
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));

  但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。

  java代码:
public Criteria getExecutableCriteria(Session session) {
 impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy
 return impl;
}

  解决方法,禁止Spring的HibernateTemplate传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:

  java代码:
public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 }, true);
}

posted @ 2009-11-03 17:41 junly 阅读(1671) | 评论 (0)编辑 收藏

 


文章来源:http://www.cnblogs.com/ycoe/archive/2006/09/28/516810.html
posted @ 2009-11-03 17:35 junly 阅读(100) | 评论 (0)编辑 收藏

1 ,void delete ( Object entity ) : 删除指定持久化实例
public void removePerson( int personid)
{
//先加载特定的实例
Object p = getHibernateTemplate().load( Person.class , new Integer( personid));
//删除特定实例
getHibernateTemplate().delete (p);
}
2 ,deleteAll ( Collection entities ) : 删除集合内全部持久化类实例

3 ,find ( String queryString ) : 根据HQL查询字符串来返回实例集合
Public List getPersons()
{
//返回Person的全部实例
return getHibernateTemplate().find ( " from Person " );
}

4 ,findByNamedQuery ( String queryName) : 根据命名查询返回实例集合

5 ,get ( Class entityClass , Serializable id ) : 根据主键加载特定持久化类的实例
public Person getPerson()
{  
//返回特定主键对应的Person实例
return (Person)getHibernateTemplate().get (Person.class , new Integer(person id));
}
6 ,save ( Object entity ) : 保存新的实例

7 ,saveOrUpdate ( Object entity ): 根据实例状态,选择保存或者更新

8 ,update ( Object entity ) : 更新实例的状态,要求entity是持久状态

9 ,setMaxResults ( int maxResults ) : 设置分页的大小。




HibernateTemplate的 更灵活 的用法 :
更灵活的访问是通过以下两个方法完成的:
Object execute ( HibernateCallback action ) ;
List execute ( HibernateCallback action );
这两个方法都需要一个HibernateCallback的实例,可以在任何有效的hibernate数据访问中使用。用法灵活,解决了Spring封装Hibernate后灵活性不足的缺陷。 HibernateCallback 是一个接,该接口只有一个方doInHibernate ( org.hibernate.Session session ), 该方法只有一个参数Session.
public class PersonDaolmpl implements PersonDao
{
// 私有实例变量保存SessionFactory
private SessionFactory sessionFactory;
// 依赖注入必需的setter 方法
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}

/**
*通过人名查找所有匹配该名的Person 实例
@param name 匹配的人名
@return 匹配该任命的全部Person 集合
*/

public List findPersonsByName(final String name)
//创建HibernateTemplate实例
HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
//返回HibernateTemplate的execute 的结果
return (List) hibernateTemplate.execute (
//创建匿名内部类
new HibernateCallback ()
public Object doInHibernate (Session session)
throws Hibernate Exception
{
//使用条件查询的方法返回
List result = session.createCriteria(Person.class)
.add(Restrictions.like(
"name", name+ " %") .list ( ) ;
return result;
}
 ) :
}

}

注意:在方法doInHibernate内可以访问到Session,该session是完全绑定到当前线程的Session实例,保证在对于复杂的持久层访问时,依然可以使用Hibernate的访问方式。
posted @ 2009-11-03 17:20 junly 阅读(5317) | 评论 (3)编辑 收藏
仅列出标题
共18页: First 上一页 9 10 11 12 13 14 15 16 17 下一页 Last