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的效率。