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提供了一种动态SQL机制,通过占位符来实现参数绑定和动态条件生成。 在描述中提到的“##”是Ibatis中的一个特殊占位符,它的主要功能是在拼接SQL字符串时处理参数。与常用的“#{}”占位符不同...
在ibatis框架中,开发者经常需要根据用户的输入来动态构建SQL查询语句。例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为...
iBatis的动态SQL功能是其一大亮点,它允许在映射文件中编写条件语句,大大提高了SQL的灵活性。这部分源码主要在`org.apache.ibatis.builder.xml.XMLMapperBuilder`和`org.apache.ibatis.scripting.xmltags....
同时,对于复杂的业务场景,iBATIS支持动态SQL,使得在映射文件中可以编写条件语句,根据对象状态动态生成执行的SQL片段。 最后,iBATIS 2.0的核心API主要包括SqlMapConfig.xml配置文件、SqlMapClient接口及其实现...
4. 动态SQL:iBATIS支持在映射文件中使用条件语句,可以根据传入的参数动态生成SQL,提高了代码的可读性和复用性。 5. 事务管理:iBATIS提供了事务控制机制,可以在应用中方便地进行事务开始、提交和回滚。 6. ...
- **动态SQL元素**:iBatis支持使用动态SQL来构建复杂的查询条件。例如,可以使用`<isNotEmpty>`元素来根据条件添加`ORDER BY`子句。 ```xml ORDER BY #orderField# ``` - **自定义SQL片段**:通过`...
`<update>`和`<delete>`分别对应更新和删除操作,同样支持动态条件。此外,还有`<resultMap>`用于定义结果集映射,`<parameterMap>`用于参数对象的映射等,这些元素都是通过`sql-map-2.dtd`定义的。 其次,`sql-map...
文档则可能详细解释了如何配置、使用这两项技术,以及在遇到问题时如何调试和解决。 5. 学习路径:对于初学者,首先需要理解Freemarker的基本语法和模板设计理念,然后学习iBatis的配置、映射和动态SQL,最后通过...
3. **SQL动态化**:Ibatis支持动态SQL,通过条件标签(if、where、choose、when、otherwise等)可以根据业务需求动态构建SQL语句,避免了大量的字符串拼接。 4. **结果映射**:通过ResultMap,可以将查询结果自动...
4. **动态SQL**:Ibatis支持在XML映射文件中编写动态SQL,可以根据条件动态地拼接SQL语句。 5. **参数映射和结果映射**:通过`<parameterMap>`和`<resultMap>`标签,可以定义复杂参数和结果对象的映射。 6. **缓存...
iBatis(现在称为MyBatis)是由Apache软件基金会维护的一个开源项目,它解决了Java应用程序直接操作数据库时面临的许多问题,如SQL的动态生成、事务管理等。iBatis的核心理念是将SQL语句写在XML配置文件中,通过Java...
3. **支持动态SQL**:ibatis支持根据条件动态构建SQL语句,这对于复杂的查询场景非常有用。 4. **易于调试**:由于SQL语句是独立于Java代码的,因此在出现问题时更容易定位问题所在。 5. **性能优势**:ibatis通常被...
动态SQL是iBatis的一大亮点,它允许在运行时根据条件构建SQL语句。 5. **API参考**:提供详细的API接口说明,包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Executor、Mapper接口等,以及它们的...
2. **SQL映射**:在XML文件中编写SQL语句,可以是静态SQL也可以是动态SQL,动态SQL可以利用条件标签实现更灵活的查询逻辑。 3. **参数映射**:使用`<parameterMap>`定义输入参数,支持简单的类型和复杂的对象映射。 ...
1. **异常处理**:包含了Ibatis特有的异常类,如SqlMapException,DataIntegrityViolationException等,这些异常帮助开发者在遇到数据库操作问题时能快速定位错误。 2. **日志模块**:Ibatis支持多种日志实现,如...
Ibatis还支持动态SQL,允许在映射文件中编写条件语句,根据传入参数的不同动态生成SQL,极大地提高了代码的灵活性。此外,Ibatis支持一对一、一对多、多对一、多对多等各种关联映射,使得复杂的数据结构处理变得简单...
6. **动态SQL**:利用iBatis的条件语句,实现SQL的动态拼接。 7. **缓存**:了解iBatis的一级和二级缓存机制,提高性能。 深入理解iBatis的源码可以帮助你更好地理解和解决问题,例如当遇到SQL执行效率低、参数绑定...
然而,由于“最新的ibatis 3.0”不兼容Spring 3.0.1,这意味着在使用这两个框架集成时可能会遇到问题。Ibatis的依赖注入和Spring的依赖注入可能存在冲突,或者某些API可能不匹配。为了解决这个问题,开发者可能需要...