最近由于项目需要,自己尝试做了一个组合查询+分页的组件。花了5天时间,只能说是初具雏形。核心还是hibernate的QBC,只是加上了XML实现了可配置。能够满足当前项目地应用,也解决了criteria查询记录条数的BUG,有兴趣的朋友可以下载使用。
使用的例子和源码以及说明见附件。由于时间仓促,今后有空的话还会继续进行修改,提供JDBC支持,以及脱离SPRING和HIBERNATE等等。
基本使用方法如下,根据项目需求建立自己的通用条件查询对象并继承CommonCondition
/**
* 本项目的通用条件查询对象 包含cret所有页面的条件作为属性 今后可能继续增加属性
* @author fw
*
*/
public class CretCondition extends CommonCondition{
private Integer id;//xx编号
private String dept;//部门
private String job;//岗位
private String checkName;//单据经办人
private String costType;//报销单类型
private Integer state;//单据状态
private Date startDate;//起始时间
private Date endDate;//结束时间
private Date[] dateRange;//日期范围
........
}
然后编写一个总的条件配置文件,默认放src目录下,取名为condition-cfg.xml(时间仓促没来得及写验证....)
<?xml version="1.0" encoding="UTF-8"?>
<condition-cfg common-condition-class="com.lovo.cett.model.condition.CretCondition">
<!-- 为需要组合条件查询的模型编写的配置文件 默认相对目录为src 可以有多个 -->
<mapping resource="config/condition/stuffcost-condition-mapping.xml"/>
<mapping resource="config/condition/tourcost-condition-mapping.xml"/>
<!-- 配置common-condition-class中的属性和运算符号的对应关系 -->
<expression-mapping>
<equal>
<property>id</property>
<property>dept</property>
<property>job</property>
<property>costType</property>
<property>state</property>
<property>belongUserId</property>
</equal>
<between>
<property>dateRange</property>
<property>moneyRange</property>
</between>
<greater-than>
<property>startDate</property>
<property>startMoney</property>
</greater-than>
<less-than>
<property>endDate</property>
<property>endMoney</property>
</less-than>
<like>
<property>checkName</property>
</like>
<!-- 默认按模型的id属性降序排列 如果不需要排序的话 可以写一个空的<order-by/>-->
<order-by defaultProperty="id" defaultOrder="desc">
<!-- 配置通用条件对象中的orderByDate属性为动态排序字段 -->
<property>orderByDate</property>
</order-by>
</expression-mapping>
</condition-cfg>
接下来是编写针对某个模型的组合查询映射文件,例如材料报销单
<?xml version="1.0" encoding="UTF-8"?>
<condition-mapping mapping-class="com.lovo.cett.model.cost.StuffCost" >
<!-- 动态设置模型类中抓取策略 暂时只能动态设置join/select/auto
auto表示不改变抓取策略 即使用hbm文件中配置的抓取策略 可以配置多个-->
<model-fetch property="stuffCostItems" fetch="select"/>
<!-- 关联CretCondition通用条件对象和StuffCost对象的属性 -->
<property>
<condition-property>id</condition-property>
<model-property>id</model-property>
</property>
<property>
<condition-property>startDate</condition-property>
<model-property>date</model-property>
</property>
<property>
<condition-property>endDate</condition-property>
<model-property>date</model-property>
</property>
<property>
<condition-property>dept</condition-property>
<model-property>dept</model-property>
</property>
<property>
<condition-property>job</condition-property>
<model-property>job</model-property>
</property>
<property>
<condition-property>dateRange</condition-property>
<model-property>date</model-property>
</property>
<property>
<condition-property>state</condition-property>
<model-property>state</model-property>
</property>
<property>
<condition-property>checkName</condition-property>
<model-property>name</model-property>
</property>
<property>
<condition-property>moneyRange</condition-property>
<model-property>requestMoney</model-property>
</property>
<property>
<condition-property>startMoney</condition-property>
<model-property>requestMoney</model-property>
</property>
<property>
<condition-property>endMoney</condition-property>
<model-property>requestMoney</model-property>
</property>
<property>
<condition-property>orderByDate</condition-property>
<model-property>date</model-property>
</property>
</condition-mapping>
然后运行test包下的TestConditionFinderImpl
/**
* 测试
* @author fw
*
*/
public class TestConditionFinderImpl extends BaseSpringTest {
private ConditionFinder conditionFinder;
private PageBean<StuffCost> pb;
private CretCondition cc;
static final int NOW_PAGE=1;//当前第1页
static final int PAGE_SIZE=3;//每页显示3条
static final int TOTAL_COUNT=7;
@Override
protected void onSetUp() throws Exception {
/**以下条件代表:查询 经办人like fw/状态等于1/日期为昨天到今天/申请金额为100至200
* 的材料报销单 结果按日期降序
* 每页显示3条 显示第1页
* */
pb = new PageBean<StuffCost>(NOW_PAGE,PAGE_SIZE);
cc = new CretCondition();
cc.setState(1);
cc.setCheckName("fw");
Date endDate = new Date();
Date startDate = new Date();
startDate.setDate(startDate.getDate()-1);
cc.setDateRange(new Date[]{startDate,endDate});
cc.setMoneyRange(new Double[]{Double.parseDouble("100"),Double.parseDouble("200")});
cc.setOrderByDate(OrderBy.DESC);
........................
以ORACLE为例,生成SQL如下
Hibernate: select count(*) as y0_ from t_cost this_ where this_.c_type='sc' and this_.c_name like ? and this_.c_state=? and this_.c_date between ? and ? and this_.c_requestMoney between ? and ?
Hibernate: select * from ( select this_.c_id as c1_2_0_, this_.c_costdept as c3_2_0_, this_.c_date as c4_2_0_, this_.c_dept as c5_2_0_, this_.c_financeSanctionMopney as c6_2_0_, this_.c_flowchoice as c7_2_0_, this_.c_job as c8_2_0_, this_.c_loanmoney as c9_2_0_, this_.c_loanperson as c10_2_0_, this_.c_name as c11_2_0_, this_.c_remark as c12_2_0_, this_.c_requestMoney as c13_2_0_, this_.c_tourProject as c14_2_0_, this_.c_state as c15_2_0_ from t_cost this_ where this_.c_type='sc' and this_.c_name like ? and this_.c_state=? and this_.c_date between ? and ? and this_.c_requestMoney between ? and ? order by this_.c_date desc, this_.c_id desc ) where rownum <= ?
分享到:
相关推荐
本项目是一个基于SpringMVC、Spring、Hibernate和jQuery的完整分页应用,涵盖了后端服务、数据持久化、前端交互等多个重要技术领域。下面将详细解释这些技术及其在项目中的应用。 1. SpringMVC:SpringMVC是Spring...
总的来说,这个"Struts2+Spring2+Hibernate3注册查询搜索分页实例"是一个很好的学习资源,涵盖了Java Web开发中的基础和核心部分。通过学习这个实例,开发者不仅可以掌握三大框架的基本用法,还能了解到如何将它们...
6. **前端交互**:JSF页面上的分页组件会根据用户的点击事件发送AJAX请求,Controller响应这些请求并更新数据。 **优化与性能** 1. **缓存策略**:考虑使用第二级缓存来减少数据库查询,提高性能。 2. **索引优化**...
在IT行业中,SSH(Spring、Struts2、Hibernate)是一个常见的Java Web开发框架组合,用于构建高效、可维护的企业级应用程序。在这个项目中,“spring+struts2+hibernate整合实现分页”是一个基础教程,旨在帮助初学...
- 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...
在这个场景中,"JSF+Spring+Hibernate配置以及分页查询和Excel文件导出"是一个典型的企业级应用开发组合。下面将详细阐述这些技术及其整合方式。 1. JavaServer Faces (JSF): JSF是一种Java标准的MVC(模型-视图-...
常见的分页方法有基于查询结果总数的分页、基于游标的分页等。 #### 三、PageUtil类详解 `PageUtil`类是实现分页逻辑的核心组件。该类定义了一系列与分页相关的属性,并提供了初始化方法和判断当前页面状态的方法...
本项目“基于struts2+hibernate3+spring的分页组件”着重于如何在这样的集成环境中实现数据的分页显示。分页是大型数据集展示中常见的需求,它可以提高用户体验,避免一次性加载大量数据导致的性能问题。 在Struts2...
在Service层,我们通常会使用Hibernate的Criteria或HQL查询语言,结合Criteria的setFirstResult()和setMaxResults()方法,来指定查询的起始位置和结束位置,从而实现分页查询。Hibernate自动处理SQL的生成和执行,极...
Struts1、Spring和Hibernate是Java Web开发中的三...这个项目实例可以帮助开发者深入理解Struts1、Spring和Hibernate的整合使用,以及如何实现分页查询。对于学习者而言,通过实际操作和调试,可以更好地掌握这些技术。
"ext3+struts2+hibernate+spring的CRUD+分页"是一个典型的Java Web开发组合,用于实现全面的数据管理功能。这个组合充分利用了各个框架的优势,提供了一个强大的后端数据处理和前端展示的解决方案。 首先,EXT3是一...
综上所述,通过Struts处理用户请求,Spring管理组件和事务,以及Hibernate处理数据库操作,我们可以构建出一个高效、可扩展的分页应用。在这个过程中,Eclipse作为开发环境,提供对Spring和Hibernate的支持,帮助...
在这个“struts+spring+hibernate+dwr+分页例子”中,我们将深入探讨这四个框架的集成以及分页功能的实现。 1. **Struts**: Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它主要负责处理...
本项目“Extjs+Spring+Hibernate实现分页”结合了三种强大的技术,以构建一个高效、灵活的数据分页系统。下面将详细介绍这三个技术以及它们在分页中的应用。 1. **ExtJS**:ExtJS是一个JavaScript库,专门用于构建...
这个"高效率的dw+spring+hibernate分页演示例子"提供了一个实用的示例,展示了如何将这三个框架整合起来,以实现高效的数据分页功能。 首先,让我们来逐一了解这三个技术: 1. **DWR (Direct Web Remoting)**:DWR...
在SSH框架整合中,通常会结合使用Hibernate的Criteria查询或HQL(Hibernate Query Language)来获取指定范围的数据,再配合前端页面的分页组件进行展示。例如,可以使用PageHelper或MyBatis的Page插件来实现分页功能...
### j2ee中struts+hibernate+spring+pager-taglib分页实例 #### 概述 在Java企业级应用开发中,Struts、Hibernate、Spring与Pager Taglib经常被联合使用,以构建高性能、高灵活性的应用系统。本文将详细介绍如何...
在这个“Struts2+Spring+Hibernate分页显示”的解决方案中,我们将深入探讨如何利用这三大框架实现数据的分页展示。 Struts2作为MVC(模型-视图-控制器)架构的一部分,主要负责处理HTTP请求,控制应用程序的流程。...
【标题】"jsp+struts+spring+hibernate新闻系统"是一个基于Java技术栈的Web应用程序,它利用了SSH(Struts、Spring、Hibernate)框架的集成来构建一个功能完善的新闻发布与管理系统。SSH框架是Java领域中常用的MVC...