Hibernate3的DetachedCriteria支持

 Hibernate3支持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(20)));


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


  名称是“department”开发部门;


  部门里面的雇员年龄大于20岁;


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


  java代码:





detachedCriteria.getExecutableCriteria(session).list();


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


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


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


  java代码:





HibernateTemplate.execute(new HibernateCallback() {

 public Object
doInHibernate(Session session) throws HibernateException {

  ....

 }


}


  回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate
API编程了。使用了spring的之后,代码修改如下:
[b]
[/b]
  web层代码:


  java代码:





DetachedCriteria detachedCriteria =
DetachedCriteria.forClass(Department.class);


detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name",
"department")).add(Restrictions.gt(("e.age"), new Integer(20)));


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并不是org.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);

}
转自:[url=http://www.dev26.com]web开发站[/url]
深入分析RAG知识库多模态数据预处理 多模态企业数据预处理是构建高质量RAG知识库的关键环节。本文详解了处理流程:1)文档格式识别与路由;2)多模态内容提取(文本、图像、音视频);3)结构解析与语义重建;4)数据清洗与增强;5)智能分块(强调语义完整性);6)元数据注入。推荐使用开源工具如PaddleOCR、Whisper、BLIP-2等,或商业API处理复杂场景,最终生成带丰富元数据的结构化内容,为后续向量化检索奠定基础。 阅读详情

相关推荐

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1327

haibernate3使用的DetachedCriteria的getExecutableCriteria(session)方法的类型错误

最近做了一个用Hibernate3进行分页查询的东西,doInHibernate(Session session) 中运行到:CriteriaImpl criteria = (CriteriaImpl)detachedCriteria.getExecutableCriteria(session);就会抛出强制类型转换异常!   我跟踪了一下spring和Hibernate源代码,原因如下:

kevin_w_l的专栏 2338

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

weixin_43864631的博客 1万+

使用 DetachedCriteria Restrictions 查询数据时,自定义sql条件

DetachedCriteria DetachedCriteria dc = prjOutputCommonDao.createDetachedCriteria(); buildDetachedCriteria(dc, params); dc.add(Restrictions.sqlRestriction("1=2"));

cyp900509的专栏 1444

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南)

本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。

weixin_28419039的博客 252

破译丰田BEAN总线之谜

我对CAN的深入了解并不是从CAN本身开始的,而是起源于丰田公司自主研发的BEAN总线。由于BEAN总线协议并不是公开的,而是一种技术机密,所以当丰田车不在使用BEAN总线两年多后的今天,虽然这里还不敢公开技术细节,但回想起当年的作品,随便写写也算对自己的努力有所交代。   南方都市报惠州版曾经报道过一则新闻,说的是丰田皇冠车被盗率非常高。其实两年前就已经知道了皇冠车的防盗系数很低,所以当时的首

粤嵌 5263

hibernate DetachedCriteria 子查询对应sql的in语句

需要从两个关联进行数据查询。找了一下午,可算找到个能看懂的 原文链接:http://blog.sina.com.cn/s/blog_ba1bed340101lvx1.html 从数据库查询的sql语句如下: select * from bdorder where Id in (select DISTINCT details from orderDetail " ...

weixin_30325971的博客 440

火山引擎之火山方舟知识库+OpenWebUI,搭建独属于自己的AI智能客服

创建接入点,接入点名称可按个人需求而定,比如Doubao-1.5-pro-32k,在添加模型选择Doubao-1.5-pro-32k,点击确定(PS:有些模型不支持知识库,若发现后续无法选择,请重新创建推理接入点。选择应用广场,创建零代码应用,在创建好的应用设置内编辑相关信息,并选择推理接入点,即先前建好的推理接入点;此处的模型名称是火山的模型ID名称,可在OpenWebUI设置-模型 中修改名称。至此所需的apikey和模型ID和请求的api地址(可选配置,非本文重点参数)。进入火山官网,注册账号。

AmaZInGvCH的博客 2651

Hibernate的DetachedCriteria使用(含Criteria)

1、背景了解:Hibernate的三种查询方式Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种,这里做简单的概念介绍,不详细进行展开。1.1 HQL(Hibernate Query Language)与所熟悉的SQL的语法差不太多,不同的就是把表名换成了类或者对象,如下示例:@Override public SysUser findUserByLoginName(Stri...

weixin_30919919的博客 361

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

kubedns-coredns部署pod出现not ready问题

文章目录遇到的问题1、发现问题2、排查问题3、解决方法 coredns的实例health_check不通过的问题,排查和解决方法 遇到的问题 1、发现问题 pod启动但是未ready 查看是readiness失败 使用对应的URL进行curl,发现真的返回503 2、排查问题 查看错误日志,发现一堆这个错误"waiting on : kubernetes" 网上相关的问题解答 这个跟测试场景不一样,这个案例是开了防火墙,可以确认我这个案例的机器没有开防火墙,但它提醒了一点,coredns是需要访问ap

u012533481的博客 2844

Hibernate3支持DetachedCriteria 在spring上的应用

示例代码片段如下:   web层程序构造查询条件:   java代码: [code="java"]DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.add(Restrictions.eq("name", "department")...

baiyude的专栏 172

二维矩形件排样算法之最低水平线算法实现

最低水平线算法的简单实现(Python) 1、二维矩形排样算法众多,最早的有BL算法、下台阶算法、最低水平线算法等,其中最低水平线算法及其优化算法应用较多,是与智能优化算法(遗传算法、模拟退火算法等)结合的最多的算法,本文利用python对最低水平线算法做了实现...

峰爸的博客 1万+
上一篇: Hibernate 中的Projections
下一篇: javaScript
wtsoftware
博客等级 码龄19年 12粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值