`
fw2003
  • 浏览: 80168 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

基于spring+hibernate的组合查询+分页组件

    博客分类:
  • J2EE
阅读更多

  最近由于项目需要,自己尝试做了一个组合查询+分页的组件。花了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 <= ?

 

   

2
0
分享到:
评论
2 楼 fw2003 2010-12-31  
JEye17173 写道
你的改进版呢

过年的时候放出 基于JDBC的ORM 附带AOP以及默认的声明式事务 全部采用注解配置
1 楼 JEye17173 2010-11-25  
你的改进版呢

相关推荐

    springMVC+spring+hibernate+jquery分页完整项目,完整代码

    本项目是一个基于SpringMVC、Spring、Hibernate和jQuery的完整分页应用,涵盖了后端服务、数据持久化、前端交互等多个重要技术领域。下面将详细解释这些技术及其在项目中的应用。 1. SpringMVC:SpringMVC是Spring...

    struts2+spring2+hibernate3注册查询搜索分页实例

    总的来说,这个"Struts2+Spring2+Hibernate3注册查询搜索分页实例"是一个很好的学习资源,涵盖了Java Web开发中的基础和核心部分。通过学习这个实例,开发者不仅可以掌握三大框架的基本用法,还能了解到如何将它们...

    JSF+Spring+Hibernate 分页显示

    6. **前端交互**:JSF页面上的分页组件会根据用户的点击事件发送AJAX请求,Controller响应这些请求并更新数据。 **优化与性能** 1. **缓存策略**:考虑使用第二级缓存来减少数据库查询,提高性能。 2. **索引优化**...

    spring+struts2+hibernate整合实现分页

    在IT行业中,SSH(Spring、Struts2、Hibernate)是一个常见的Java Web开发框架组合,用于构建高效、可维护的企业级应用程序。在这个项目中,“spring+struts2+hibernate整合实现分页”是一个基础教程,旨在帮助初学...

    springmvc+hibernate+spring maven案例(包含分页查询)

    - 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...

    JSF+Spring+Hibernate配置以及分页查询和Excel文件导出

    在这个场景中,"JSF+Spring+Hibernate配置以及分页查询和Excel文件导出"是一个典型的企业级应用开发组合。下面将详细阐述这些技术及其整合方式。 1. JavaServer Faces (JSF): JSF是一种Java标准的MVC(模型-视图-...

    Struts2 + Spring2 + Hibernate3经典分页(包含java及jsp源码)

    常见的分页方法有基于查询结果总数的分页、基于游标的分页等。 #### 三、PageUtil类详解 `PageUtil`类是实现分页逻辑的核心组件。该类定义了一系列与分页相关的属性,并提供了初始化方法和判断当前页面状态的方法...

    基于struts2+hibernate3+spring的分页组件

    本项目“基于struts2+hibernate3+spring的分页组件”着重于如何在这样的集成环境中实现数据的分页显示。分页是大型数据集展示中常见的需求,它可以提高用户体验,避免一次性加载大量数据导致的性能问题。 在Struts2...

    Struts+Hibernate+Spring+JS 分页程序(一)

    在Service层,我们通常会使用Hibernate的Criteria或HQL查询语言,结合Criteria的setFirstResult()和setMaxResults()方法,来指定查询的起始位置和结束位置,从而实现分页查询。Hibernate自动处理SQL的生成和执行,极...

    Struts1+Spring+hibernate《最新三国人物分页》

    Struts1、Spring和Hibernate是Java Web开发中的三...这个项目实例可以帮助开发者深入理解Struts1、Spring和Hibernate的整合使用,以及如何实现分页查询。对于学习者而言,通过实际操作和调试,可以更好地掌握这些技术。

    ext3+struts2+hibernate+spring的CRUD+分页

    "ext3+struts2+hibernate+spring的CRUD+分页"是一个典型的Java Web开发组合,用于实现全面的数据管理功能。这个组合充分利用了各个框架的优势,提供了一个强大的后端数据处理和前端展示的解决方案。 首先,EXT3是一...

    使用Struts + Spring + Hibernate完成分页笔记

    综上所述,通过Struts处理用户请求,Spring管理组件和事务,以及Hibernate处理数据库操作,我们可以构建出一个高效、可扩展的分页应用。在这个过程中,Eclipse作为开发环境,提供对Spring和Hibernate的支持,帮助...

    struts+spring+hibernate+dwr+分页例子

    在这个“struts+spring+hibernate+dwr+分页例子”中,我们将深入探讨这四个框架的集成以及分页功能的实现。 1. **Struts**: Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它主要负责处理...

    Extjs+Spring+Hibernate实现分页

    本项目“Extjs+Spring+Hibernate实现分页”结合了三种强大的技术,以构建一个高效、灵活的数据分页系统。下面将详细介绍这三个技术以及它们在分页中的应用。 1. **ExtJS**:ExtJS是一个JavaScript库,专门用于构建...

    高效率的dw+spring+hibernate分页演示例子

    这个"高效率的dw+spring+hibernate分页演示例子"提供了一个实用的示例,展示了如何将这三个框架整合起来,以实现高效的数据分页功能。 首先,让我们来逐一了解这三个技术: 1. **DWR (Direct Web Remoting)**:DWR...

    struts2 + spring 3 + hibernate3.3整合实现图书馆管理管理

    在SSH框架整合中,通常会结合使用Hibernate的Criteria查询或HQL(Hibernate Query Language)来获取指定范围的数据,再配合前端页面的分页组件进行展示。例如,可以使用PageHelper或MyBatis的Page插件来实现分页功能...

    j2ee中struts+hibernate+spring+pager-taglib分页实例

    ### j2ee中struts+hibernate+spring+pager-taglib分页实例 #### 概述 在Java企业级应用开发中,Struts、Hibernate、Spring与Pager Taglib经常被联合使用,以构建高性能、高灵活性的应用系统。本文将详细介绍如何...

    struts2+spring+hibernate分页显示

    在这个“Struts2+Spring+Hibernate分页显示”的解决方案中,我们将深入探讨如何利用这三大框架实现数据的分页展示。 Struts2作为MVC(模型-视图-控制器)架构的一部分,主要负责处理HTTP请求,控制应用程序的流程。...

    jsp+struts+spring+hibernate新闻系统

    【标题】"jsp+struts+spring+hibernate新闻系统"是一个基于Java技术栈的Web应用程序,它利用了SSH(Struts、Spring、Hibernate)框架的集成来构建一个功能完善的新闻发布与管理系统。SSH框架是Java领域中常用的MVC...

Global site tag (gtag.js) - Google Analytics