知识大全 Hibernate3的DetachedCriteria支持

Posted 条件

篇首语:知识就像内裤,看不见但很重要。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate3的DetachedCriteria支持相关的知识,希望对你有一定的参考价值。

Hibernate3的DetachedCriteria支持  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Hibernate 支持DetachedCriteria 这是一个非常有意义的特性!我们知道 在常规的Web编程中 有大量的动态条件查询 即用户在网页上面自由选择某些条件 程序根据用户的选择条件 动态生成SQL语句 进行查询

  针对这种需求 对于分层应用程序来说 Web层需要传递一个查询的条件列表给业务层对象 业务层对象获得这个条件列表之后 然后依次取出条件 构造查询语句 这里的一个难点是条件列表用什么来构造?传统上使用Map 但是这种方式缺陷很大 Map可以传递的信息非常有限 只能传递name和value 无法传递究竟要做怎样的条件运算 究竟是大于 小于 like 还是其它的什么 业务层对象必须确切掌握每条entry的隐含条件 因此一旦隐含条件改变 业务层对象的查询构造算法必须相应修改 但是这种查询条件的改变是隐式约定的 而不是程序代码约束的 因此非常容易出错

  DetachedCriteria可以解决这个问题 即在web层 程序员使用DetachedCriteria来构造查询条件 然后将这个DetachedCriteria作为方法调用参数传递给业务层对象 而业务层对象获得DetachedCriteria之后 可以在session范围内直接构造Criteria 进行查询 就此 查询语句的构造完全被搬离到web层实现 而业务层则只负责完成持久化和查询的封装即可 与查询条件构造完全解耦 非常完美!这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧!

  示例代码片段如下

  web层程序构造查询条件

  java代码

   DetachedCriteria detachedCriteria = DetachedCriteria forClass(Department class); detachedCriteria add(Restrictions eq( name department )) createAlias( employees e ) add(Restrictions gt(( e age ) new Integer( )));

  Department和Employee是一对多关联 查询条件为

  名称是 department 开发部门 部门里面的雇员年龄大于 岁

  业务层对象使用该条件执行查询

  java代码

   detachedCriteria getExecutableCriteria(session) list();

  最大的意义在于 业务层代码是固定不变的 所有查询条件的构造都在web层完成 业务层只负责在session内执行之 这样代码就可放之四海而皆准 都无须修改了

  然而Spring和Hibernate 的DetachedCriteria有不兼容的问题 因此在Spring环境下面使用Hibernate 需要注意

  Spring的HibernateTemplate提供了Hibernate的完美封装 即通过匿名类实现回调 来保证Session的自动资源管理和事务的管理 其中核心方法是

  java代码

   HibernateTemplate execute(new HibernateCallback()  public Object doInHibernate(Session session) throws HibernateException     

  回调方法提供了session作为参数 有了session 就可以自由的使用Hibernate API编程了 使用了spring的之后 代码修改如下

  web层代码

  java代码

   DetachedCriteria detachedCriteria = DetachedCriteria forClass(Department class); detachedCriteria createAlias( employees e ) add(Restrictions eq( name department )) add(Restrictions gt(( e age ) new Integer( ))); departmentManager findByCriteria(detachedCriteria);

  构造detachedCriteria 作为参数传递给departmentManager

  业务层代码使用spring DepartmentManager的findByCriteria如下

  java代码

   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();     );

  实际上也就是

  java代码

   Criteria criteria = detachedCriteria getExecutableCriteria(session); return criteria list();

  而已

  但是该程序代码执行 会抛出强制类型转换异常!

  我跟踪了一下spring和Hibernate源代码 原因如下

  spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数 但是实际上 默认情况下 HibernateTemplate传递给回调接口的session并不是 hibernate impl SessionImpl类 而是SessionImpl类的一个Proxy类 之所以替换成为一个Proxy类 HibernateTemplate的注释说明 Proxy提供了一些额外的功能 包括自动设置Cachable Transaction的超时时间 Session资源的更积极的关闭等等

  java代码

   private boolean exposeNativeSession = false;   execute方法内部 Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));

  但是遗憾的是 Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl 但是spring传过来的却是一个Proxy类 因此就报错了

  java代码

   public Criteria getExecutableCriteria(Session session)  impl setSession( (SessionImpl) session ); // 要求SessionImpl Spring传递的是Proxy  return impl;

  解决方法 禁止Spring的HibernateTemplate传递Proxy类 强制要求它传递真实的SessionImpl类 即给exexute方法增加一个参数 提供参数为true 如下

  java代码

  

  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);

  附一个进行模糊查询的例子

cha138/Article/program/Java/ky/201311/28847

相关参考

知识大全 Hibernate3.X 实践总结

Hibernate3.X实践总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibernat

知识大全 Hibernate3的DetachedCriteria支持[1]

Hibernate3的DetachedCriteria支持[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 Hibernate3的DetachedCriteria支持[2]

Hibernate3的DetachedCriteria支持[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 Hibernate3的DetachedCriteria支持[3]

Hibernate3的DetachedCriteria支持[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 Hibernate3新特性及发展趋

Hibernate3新特性及发展趋  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiberna

知识大全 hibernate3.0 DTD 定义路径问题

hibernate3.0DTD定义路径问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家在

知识大全 开源框架Hibernate3的新特性以及发展趋势

开源框架Hibernate3的新特性以及发展趋势  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 整合Hibernate3与JBOSS 3.2.X

整合Hibernate3与JBOSS3.2.X  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前

知识大全 hibernate3二级缓存的配置及测试

配置ehcachexml文件放到classpath下 <?xmlversion=encoding=GBK?>     <e

知识大全 用Hibernate3.1实现XML和数据库的同步

用Hibernate3.1实现XML和数据库的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!