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