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