当前位置: 首页 > 知识库问答 >
问题:

sql - mybatis的trim标签?

呼延曜灿
2024-09-05

写了一个select的检索,但是一直提示报错:错误主要是多了一个where
报错信息

ERROR c.a.d.f.s.StatFilter - [mergeSql,150] - merge sql error, dbType mysql, druid-1.2.16, sql : select count(0) from ( 
select ps.unit,ps.serialNumber,ps.batchCode,ps.pnCode,ps.materialCode,ps.pn_information,ps.specificationType,ps.assetClass,
        pu.storageType ,pu.name ,pu.department ,pu.create_time, pu.storageRoom ,pu.remark,sum(numbersRuKu) as numbersRuKu
        from pnassertrukudetails ps left join pnassertruku pu on ps.parent_pnAssertRuku_id = pu.child_pnAssertRukuDetails_id
         **where** group by materialCode
 ) tmp_count

但是我用了trim,还是报同样的错误:
写的sql

<select id="getKuCunInformation" parameterType="com.ruoyi.system.domain.PnModelInOutInventory" resultMap="result">
        select ps.unit,ps.serialNumber,ps.batchCode,ps.pnCode,ps.materialCode,ps.pn_information,ps.specificationType,ps.assetClass,
        pu.storageType ,pu.name ,pu.department ,pu.create_time, pu.storageRoom ,pu.remark,sum(numbersRuKu) as numbersRuKu
        from pnassertrukudetails ps left join pnassertruku pu on ps.parent_pnAssertRuku_id = pu.child_pnAssertRukuDetails_id
        <trim prefix="where" suffixOverrides="AND |OR">
            <if test="materialCode == null or materialCode == '' ">
                <if test="pnCode == null or pnCode == '' ">
                    <if test="storageType == null or storageType == '' ">
                        <if test="storageRoom == null or storageRoom == '' ">
                            <if test="createTime == null or createTime == '' ">
                                group by materialCode and
                            </if>
                        </if>
                    </if>
                </if>
            </if>

            <if test="materialCode != null and materialCode != '' ">
                materialCode = #{materialCode} and
            </if>
            <if test="pnCode != null and pnCode != '' ">
                pnCode = #{pnCode} and
            </if>
            <if test="storageType != null and storageType != '' ">
                storageType = #{storageType} and
            </if>
            <if test="storageRoom != null and storageRoom != '' ">
                storageRoom = #{storageRoom} and
            </if>
            <if test="assetClass != null and assetClass != '' ">
                assetClass = #{assetClass} and
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
                date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d') and
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
                date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d') and
            </if>
        </trim>
    </select>

共有1个答案

裴姚石
2024-09-05

有没有可能是你的逻辑错误,<trim></trim>的作用是,如果标签内有任意一个条件命中,则添加prefix,你的是where,另外去除多余的suffixOverrides,你是AND或者OR,现在是其它<if>没有命中,但是group by materialCode and命中了,命中后去除最后的and,在最前面加where
我没有看懂你要拼接什么样的SQL,你的if到底是where条件,还是追加到group by之后

猜测你的意图如下:

<select id="getKuCunInformation" parameterType="com.ruoyi.system.domain.PnModelInOutInventory" resultMap="result">
    select ps.unit, ps.serialNumber, ps.batchCode, ps.pnCode, ps.materialCode, ps.pn_information, 
           ps.specificationType, ps.assetClass, pu.storageType ,pu.name ,pu.department ,
           pu.create_time, pu.storageRoom ,pu.remark,sum(numbersRuKu) as numbersRuKu
    from pnassertrukudetails ps
    left join pnassertruku pu on ps.parent_pnAssertRuku_id = pu.child_pnAssertRukuDetails_id
    <where>
        </if test="materialCode != null and materialCode != '' ">
            materialCode = #{materialCode}
        </if>
        <if test="pnCode != null and pnCode != '' ">
            and pnCode = #{pnCode}
        </if>
        <if test="storageType != null and storageType != '' ">
            and storageType = #{storageType}
        </if>
        <if test="storageRoom != null and storageRoom != '' ">
            and storageRoom = #{storageRoom}
        </if>
        <if test="assetClass != null and assetClass != '' ">
            and assetClass = #{assetClass}
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
            and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
            and date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
        </if>
    </where>
    <if test="materialCode == null or materialCode == '' ">
        <if test="pnCode == null or pnCode == '' ">
            <if test="storageType == null or storageType == '' ">
                <if test="storageRoom == null or storageRoom == '' ">
                    <if test="createTime == null or createTime == '' ">
                        group by materialCode
                    </if>
                </if>
            </if>
        </if>
    </if>
</select>
 类似资料:
  • 主要内容:示例在 MyBatis 中除了使用 if+where 实现多条件查询,还有一个更为灵活的元素 trim 能够替代之前的做法。 trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号 或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。trim 语法格式如下。 trim 中属性说明如下。 属性 描述 prefix 给SQL语句拼接的前缀,为

  • 1. 前言 在前面的小节中,我们一起学习了 if 标签,在通过 if 判断动态插入或查询的时候容易产生多余的前缀(如 WHERE)或后缀(如 , ),为了解决这类问题 MyBatis 提供了 where、set、trim 三个实用的标签。 其中 where 和 set 标签都是 trim 标签的一种特殊情况,不过使用频率非常高,因此被单独定义成了标签。本小节我们将一起来学习它们。 2. 定义 慕课

  • 本文向大家介绍Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解,包括了Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解的使用技巧和注意事项,需要的朋友参考一下 动态SQL就是动态的生成SQL。 if标记 假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123

  • 问题内容: 我有以下字符串:“ BOB ”,如何修剪,使其显示为“ BOB” 我尝试了RTRIM(’BOB ‘,’‘),但由于显示仅需要1个参数而无法正常工作。 问题答案: 应该做。

  • 本文向大家介绍MyBatis使用动态SQL标签的小陷阱,包括了MyBatis使用动态SQL标签的小陷阱的使用技巧和注意事项,需要的朋友参考一下  MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plai

  • 本文向大家介绍MyBatis的 config.xml标签,包括了MyBatis的 config.xml标签的使用技巧和注意事项,需要的朋友参考一下 以上所述是小编给大家介绍的MyBatis的 config.xml标签,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 本文向大家介绍MyBatis动态Sql之if标签的用法详解,包括了MyBatis动态Sql之if标签的用法详解的使用技巧和注意事项,需要的朋友参考一下 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景: 1.根据查询条件实现动态

  • 这个库是生成动态 SQL 语句的框架。可把它看作是一个类型安全的 SQL 模板库,另外还支持 MyBatis3 和 Spring JDBC 模板。 该库将生成格式化为由 MyBatis 或 Spring 使用的完整 DELETE,INSERT,SELECT 和 UPDATE 语句。 最常见的用例是生成语句和一组匹配的参数,这些参数可以被 MyBatis 直接使用。该库还将生成与 Spring JD