String hql = "from TradeRecord as tr where tr.TradeTime>= :startTime and tr.TradeTime <= :endTime and tr.CustomerId =:cid";
  String[] params = { "startTime", "endTime", "cid" };
  Object[] args = { startTime, endTime, new Long(cid) };
 List list= this.getHibernateTemplate().findByNamedParam(hql,params,args);
这是你调用list中的对象的get方法,如果这个get方法需要lazy load,你将看到如下异常:
 ERROR LazyInitializationException:19 - could not initialize proxy - the owning Session was closed

这个问题困扰的我都要跳楼了。

现在这样就可以了:
Session session = this.getSession();
  String hql = "from TradeRecord as tr where tr.TradeTime>= :startTime "
    + "and tr.TradeTime <= :endTime and tr.CustomerId =:cid";
  String[] params = { "startTime", "endTime", "cid" };
  Object[] args = { startTime, endTime, new Long(cid) };
  Query query = session.createQuery(hql);
  query.setDate("startTime",startTime);
  query.setDate("endTime",endTime);
  query.setLong("cid", cid);
  List list = query.list();

也就是说,调用HibernateTemplate的findByNamedParam方法,他在执行完以后会把session自动关掉。

我现在在找源码看个究竟。

这个问题虽然解决了,但是并不值得高兴,因为我发现hibernate执行的SQL语句要比我用JDBC写的sql语句多很多。我很怀疑hibernate的效率。