`
xiegangthrille
  • 浏览: 93934 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Ibatis多表动态条件查询遇到的问题

    博客分类:
  • SSH
阅读更多

Ibatis取多表多条件查询记录时,遇到了问题??

条件参数:采用了一个实体类

返回结果集:采用的是HashMap

实现分页:采用了高人已经写好的分页类(Paginated),采用的是反射.适用于Spring+ibatis开发.

问题一:我的条件参数放在实体类(MaterialMap),当我用下面这个方法传参数时ibatis映射文件能取参数,但是执行结果是'SQL语句错误'.

    实体类:

package com.exeerp.qm.bean;

/**
 * 原料检验多表采集数据实体类
 * @author 谢刚
 *
 */
@SuppressWarnings("serial")
public class MaterialMap {

	/**
	 * 原料检验ID
	 */
	private String qmMaTransferCheckID;
	
	/**
	 * 原料名称
	 */
	private String rdMaName;
	
	/**
	 * 批号
	 */
	
	private String stMaBatchCode;
	
	/**
	 * 供应商
	 */
	
	private String bmSuName;

 

 

    Action类:

	
	@SuppressWarnings({ "finally", "unchecked" })
	public String getMaterialList(){
		String result=ERROR;
		MaterialMap map=new MaterialMap();
		try{
			map.setQmMaTransferCheckID("20090508193711238");
			map.setRdMaName(rdMaName);
			map.setStMaBatchCode(BatchCode);
			map.setBmSuName(bmSuName);
			paging=materialManager.getListForPage(map, 10, currentPage, "materiallList.do");
			ArrayList list=(ArrayList)paging.getRecordList();
			this.getRequest().setAttribute("hashMapList", list);
			result=SUCCESS;
		}catch(Exception ex){
			this.setMessage(ex.getMessage());
			ex.printStackTrace();
		}finally{
			return result;
		}
	}

 

    Ibatis映射:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="qm">
	<typeAlias alias="HashMap" type="java.util.HashMap" />
	<typeAlias alias="MaterialMap" type="com.exeerp.qm.bean.MaterialMap" />
   	<select id="selectForPage-MaterialMap" remapResults="true" parameterClass="Map" resultClass="HashMap">
   	<![CDATA[
   		select 
				*
 		from 
 			(
 		
 			select 
 			
 				qmMa.Materialcheckid,rdMak.Name as rdMakName,rdMa.Name as rdMaName,rdMa.Specs,
 				bmSu.Name as bmSuName,qmMa.manufactureDate,qmMa.checkDate,qmMa.checker,
 				qmMa.checkResult,qmMa.auditer,qmMa.status,rownum rn 
			
			from 
					QM_MATERIAL qmMa,ST_TRANSFERCHECK stTr,ST_MATERIAL stMa,
					ST_MATERIALBOOKIN stMab,BM_SUPPLIER bmSu,BM_SPRODUCT bmSp,
					RD_Material rdMa,RD_MATERIALKIND rdMak
		 ]]>
				<dynamic prepend="where">
					qmMa.TransferCheckID=stTr.TransferCheckID
				and 
					stTr.ST_MaterialID=stMa.ST_MaterialID
				and
					stMa.BookID=stMab.BookID
				and 
					stMab.SupplierID=bmSu.SupplierID
				and 
					bmSu.SupplierID=bmSp.SupplierID
				and 
					bmSp.MaterialID=rdMa.MaterialID
				and
					rdMa.Kind=rdMak.Kind
				
				<isNotEmpty prepend="and" property="qmMaTransferCheckID">
					and	qmMa.MaterialcheckID=#qmMaTransferCheckID#
				</isNotEmpty>

				<isNotEmpty prepend="and" property="rdMaName">
					and	rdMa.Name like '%$rdMaName$%'
				</isNotEmpty>
				<isNotEmpty prepend="and" property="stMaBatchCode">
					and	stMa.BatchCode=#stMaBatchCode#
				</isNotEmpty>
				<isNotEmpty prepend="and" property="bmSuName">
					and	bmSu.Name like '%$bmSuName$%'
				</isNotEmpty>
					
					
		 </dynamic>

 

 

 

 

 解决办法:

				
				<isNotEmpty prepend="and" property="qmMaTransferCheckID">
					and	qmMa.MaterialcheckID=#qmMaTransferCheckID#
				</isNotEmpty>

				<isNotEmpty prepend="and" property="rdMaName">
					and	rdMa.Name like '%$rdMaName$%'
				</isNotEmpty>
				<isNotEmpty prepend="and" property="stMaBatchCode">
					and	stMa.BatchCode=#stMaBatchCode#
				</isNotEmpty>
				<isNotEmpty prepend="and" property="bmSuName">
					and	bmSu.Name like '%$bmSuName$%'
				</isNotEmpty>
					

 

只不过加了个and ,开始我以为'prepend'属性会自动加'and',属性property='实体对象属性'.总之对东西了解不够,浪费了很多时间.

 

 

分享到:
评论

相关推荐

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    ibatis 用HashMap解决resultClass映射

    在日常的软件开发过程中,尤其是在处理数据库查询时,我们经常面临一个问题:如何优雅地处理那些未知或动态变化的列名及列数的情况?在这种情况下,传统的实体类映射方式往往难以满足需求。本文将详细介绍如何利用 ...

    ibatis开发过程取值问题

    在这个过程中,Ibatis提供了一种动态SQL机制,通过占位符来实现参数绑定和动态条件生成。 在描述中提到的“##”是Ibatis中的一个特殊占位符,它的主要功能是在拼接SQL字符串时处理参数。与常用的“#{}”占位符不同...

    ibatis sql语句对条件中特殊字符% # 处理

    在ibatis框架中,开发者经常需要根据用户的输入来动态构建SQL查询语句。例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    iBatis的动态SQL功能是其一大亮点,它允许在映射文件中编写条件语句,大大提高了SQL的灵活性。这部分源码主要在`org.apache.ibatis.builder.xml.XMLMapperBuilder`和`org.apache.ibatis.scripting.xmltags....

    ibatis2.0中文API

    同时,对于复杂的业务场景,iBATIS支持动态SQL,使得在映射文件中可以编写条件语句,根据对象状态动态生成执行的SQL片段。 最后,iBATIS 2.0的核心API主要包括SqlMapConfig.xml配置文件、SqlMapClient接口及其实现...

    iBATIS2.3.4 jar包及源码

    4. 动态SQL:iBATIS支持在映射文件中使用条件语句,可以根据传入的参数动态生成SQL,提高了代码的可读性和复用性。 5. 事务管理:iBATIS提供了事务控制机制,可以在应用中方便地进行事务开始、提交和回滚。 6. ...

    ibatis出错调试心得

    - **动态SQL元素**:iBatis支持使用动态SQL来构建复杂的查询条件。例如,可以使用`&lt;isNotEmpty&gt;`元素来根据条件添加`ORDER BY`子句。 ```xml ORDER BY #orderField# ``` - **自定义SQL片段**:通过`...

    ibatis的dtd文件

    `&lt;update&gt;`和`&lt;delete&gt;`分别对应更新和删除操作,同样支持动态条件。此外,还有`&lt;resultMap&gt;`用于定义结果集映射,`&lt;parameterMap&gt;`用于参数对象的映射等,这些元素都是通过`sql-map-2.dtd`定义的。 其次,`sql-map...

    freemark与ibatis动态运用与说明,程序,源代码,文档

    文档则可能详细解释了如何配置、使用这两项技术,以及在遇到问题时如何调试和解决。 5. 学习路径:对于初学者,首先需要理解Freemarker的基本语法和模板设计理念,然后学习iBatis的配置、映射和动态SQL,最后通过...

    ibatis 资料大全

    3. **SQL动态化**:Ibatis支持动态SQL,通过条件标签(if、where、choose、when、otherwise等)可以根据业务需求动态构建SQL语句,避免了大量的字符串拼接。 4. **结果映射**:通过ResultMap,可以将查询结果自动...

    ibatis学习

    4. **动态SQL**:Ibatis支持在XML映射文件中编写动态SQL,可以根据条件动态地拼接SQL语句。 5. **参数映射和结果映射**:通过`&lt;parameterMap&gt;`和`&lt;resultMap&gt;`标签,可以定义复杂参数和结果对象的映射。 6. **缓存...

    最简单的iBatis入门例子

    iBatis(现在称为MyBatis)是由Apache软件基金会维护的一个开源项目,它解决了Java应用程序直接操作数据库时面临的许多问题,如SQL的动态生成、事务管理等。iBatis的核心理念是将SQL语句写在XML配置文件中,通过Java...

    ibatis和hibernate的简单介绍

    3. **支持动态SQL**:ibatis支持根据条件动态构建SQL语句,这对于复杂的查询场景非常有用。 4. **易于调试**:由于SQL语句是独立于Java代码的,因此在出现问题时更容易定位问题所在。 5. **性能优势**:ibatis通常被...

    ibatis3.1官方中文帮助文档

    动态SQL是iBatis的一大亮点,它允许在运行时根据条件构建SQL语句。 5. **API参考**:提供详细的API接口说明,包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Executor、Mapper接口等,以及它们的...

    ibatis API大全

    2. **SQL映射**:在XML文件中编写SQL语句,可以是静态SQL也可以是动态SQL,动态SQL可以利用条件标签实现更灵活的查询逻辑。 3. **参数映射**:使用`&lt;parameterMap&gt;`定义输入参数,支持简单的类型和复杂的对象映射。 ...

    ibatis基本架包

    1. **异常处理**:包含了Ibatis特有的异常类,如SqlMapException,DataIntegrityViolationException等,这些异常帮助开发者在遇到数据库操作问题时能快速定位错误。 2. **日志模块**:Ibatis支持多种日志实现,如...

    ibatis2.3.4.8.jar 和 ibatis-2.3.4.726.jar两个版本的下载

    Ibatis还支持动态SQL,允许在映射文件中编写条件语句,根据传入参数的不同动态生成SQL,极大地提高了代码的灵活性。此外,Ibatis支持一对一、一对多、多对一、多对多等各种关联映射,使得复杂的数据结构处理变得简单...

    ibatis使用备注

    6. **动态SQL**:利用iBatis的条件语句,实现SQL的动态拼接。 7. **缓存**:了解iBatis的一级和二级缓存机制,提高性能。 深入理解iBatis的源码可以帮助你更好地理解和解决问题,例如当遇到SQL执行效率低、参数绑定...

    最新的ibatis 3.0(包含源码)

    然而,由于“最新的ibatis 3.0”不兼容Spring 3.0.1,这意味着在使用这两个框架集成时可能会遇到问题。Ibatis的依赖注入和Spring的依赖注入可能存在冲突,或者某些API可能不匹配。为了解决这个问题,开发者可能需要...

Global site tag (gtag.js) - Google Analytics