这篇文章给大家介绍Hibernate中Template如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
我们注重客户提出的每个要求,我们充分考虑每一个细节,我们积极的做好成都网站设计、网站建设、外贸网站建设服务,我们努力开拓更好的视野,通过不懈的努力,创新互联赢得了业内的良好声誉,这一切,也不断的激励着我们更好的服务客户。 主要业务:网站建设,网站制作,网站设计,微信平台小程序开发,网站开发,技术开发实力,DIV+CSS,PHP及ASP,ASP.Net,SQL数据库的技术开发工程师。
spring的Hibernate Template的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,Hibernate Template传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,Hibernate Template的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。
private boolean exposeNativeSession = false; ... execute方法内部: Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));
但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。
public Criteria getExecutableCriteria(Session session) { impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy return impl; }
解决方法,禁止Spring的Hibernate Template传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:
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); }
附一个进行模糊查询的例子:
public PaginationSupport findPageByCriteria(int startIndex, int pageSize,
String sortColumnId, Boolean bSortOrder, final String likeValue) {DetachedCriteria detachedCriteria = DetachedCriteria .forClass(Time.class);
// like condition
if ((likeValue != null && likeValue.trim().length() > 0)) {
detachedCriteria.add(Restrictions.or(Restrictions.sqlRestriction
("statime like ?", "%" + likeValue + "%", Hibernate.STRING),Restrictions.
sqlRestriction("endtime like ?", "%" + likeValue + "%", Hibernate.STRING)));}
关于Hibernate中Template如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。