mybatis group by substr函数传参报错的解决

目录
  • mybatis group by substr传参报错
    • 报异常
    • 原因
  • 使用group by 分组查询返回为null
    • 解决方法

mybatis group by substr传参报错

报异常

### Cause: java.sql.SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式

SELECT
    SUBSTR( region_code, 1,#{ queryMap.groupCodeLength, jdbcType = INTEGER } ) AS "region_code",
    count( CASE WHEN TYPE = 1 THEN 0 END ) AS "like",
    count( CASE WHEN TYPE = 2 THEN 0 END ) AS "roast" 
FROM
    t_pub_sentiment 
WHERE
    1 = 1 
GROUP BY
    SUBSTR(region_code,1,#{ queryMap.groupCodeLength,jdbcType = INTEGER })

更改后:

SELECT
    SUBSTR( region_code, 1, $ { queryMap.groupCodeLength } ) AS "region_code",
    count( CASE WHEN TYPE = 1 THEN 0 END ) AS "like",
    count( CASE WHEN TYPE = 2 THEN 0 END ) AS "roast" 
FROM
    t_pub_sentiment 
WHERE
    1 = 1 
GROUP BY
    SUBSTR( region_code, 1, $ { queryMap.groupCodeLength } )

原因

#{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替。而 ${} 则只是简单的字符串替换。

${}有sql注入的风险,需谨慎使用。

使用group by 分组查询返回为null

我在使用mybatis进行分组查询时数据库有数据,但是mybatis返回为null,使用mybatis版本为3.4.1

解决方法

在resultMap的result标签中添加 property属性

如下:

<resultMap id="deptMap" type="java.util.Map">
        <result column="id" property="id"/>
        <result column="dept_name" property="deptname"/>
        <result column="count(1)" property="count"/>
    </resultMap>
  
 <select id="getDeptByIdStep" resultMap="deptMap">
  select  id,dept_name,count(1)  from tbl_dept where dept_id=#{id} group by id;
 </select>

我在第一次使用时没有添加property导致mybatis返回null,添加后就可以正常返回。

dao层代码

public List<Map> getDeptByIdStep(Integer id);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis框架order by作为参数传入时失效的解决

    mybatis order by作为参数传入失效 mxl中的语句如下 <select id="statToday" resultType="com.dahua.la.business.model.vo.StatSysResultVO"> select a, b, count(1) as total from table where a is not null and b is not null and operateTime >= #{startT

  • Mybatis order by 动态传参出现的问题及解决方法

    问题由来 一个简单的需求,要求把和当前用户相关的数据置顶展示. 这里,我用了一个简单的用户表来复现这个需求. 很简单,查询语句后面加上:order by t.login_name='wulaoer' desc 就行了. 如下所示,吴老二就到顶了. 那Mybatis脚本怎么写呢? 就这么写

  • MyBatis如何调用存储过程与存储函数

    目录 1.MyBatis调用存储过程 2.MyBatis调用存储函数 1.MyBatis调用存储过程 MyBatis支持使用存储过程的配置.当使用存储过程时,需要设置一个参数"mode",其值有IN(输入参数).OUT(输出参数)和INOUT(输入/输出参数). MyBatis定义存储过程如下: <!-- 存储过程 --> <select id="selectSomeThing" statementType="CALLABLE"

  • mybatis group by substr函数传参报错的解决

    目录 mybatis group by substr传参报错 报异常 原因 使用group by 分组查询返回为null 解决方法 mybatis group by substr传参报错 报异常 ### Cause: java.sql.SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式 SELECT     SUBSTR( region_code, 1,#{ queryMap.groupCodeLength, jdbcType = INTEGE

  • JavaScript中使用arguments获得函数传参个数实例

    JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错. 实参比形参多不会报错 function say(a){    alert(a); }   say('琼台博客','WEB技术博客'); 执行结果 我们再来看看形参比实参多的结果 function say(a,b){    alert('a 的值是 '+a+'\nb 的值是 '+b); }   say('琼台博客'); 执行结果 a 对应第一个实参"琼台博客",b

  • 详解mybatis #{}和${}的区别、传参、基本语法

    1 #{}和${}的区别.及注入问题 (1) 区别: 首先清楚一点,动态 SQL 是 mybatis 的强大特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析,#{} 和 ${} 在预编译中的处理是不一样的: 例如:select * from t_user where userName = #{name}; #{}预编译:用一个占位符 ? 代替参数:select * from t_user where userName = ? #{}预编

  • MyBatis几种不同类型传参的方式总结

    目录 MyBatis几种不同类型传参方式 1.String类型 2.对于传入Map参数类型 3.传入的参数类型为list 4.传入对象 总结 MyBatis几种不同类型传参方式 在Web开发过程中,我们根据业务需求将不同类型参数从后台传入到MyBatis的各个不同的mapper命名空间中,包括有string类型,map类型,list集合类型,或者是直接传入一个对象等. 1.String类型 1.1对于string类型,我们一般传 在sql中写明parameterType="string"

  • PHP闭包函数传参及使用外部变量的方法

    本文实例讲述了PHP闭包函数传参及使用外部变量的方法.分享给大家供大家参考,具体如下: 在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参.如下: //测试闭包传参及use使用外部变量 public function testClosure($t1, $t2) { $closure = function ($param1, $param2) use ($t1, $t2) { echo $param1.$

  • python 函数传参之传值还是传引用的分析

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

  • 详解python函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

  • 详解python函数传参传递dict/list/set等类型的问题

    传参时传递可变对象,实际上传的是指向内存地址的指针/引用 这个标题是我的结论,也是我在做项目过程查到的.学过C的都知道,函数传参可以传值,也可以传指针.指针的好处此处不再赘述. 先上代码看看效果: def trans(var): return var source = {1: 1} dist = trans(source) source[2] = 2 print(source) print(dist) 运行结果: {1: 1, 2:2} {1: 1, 2:2} 可以看到改变了source时,di

  • python函数传参意义示例详解

    目录 C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办? 比如我们想要传一个x到函数中做个运算改变x的值: def change(y): y += 1 x = 1 print ("before change:", x) change(x) print ("after change: ", x) 得到的结果是 before change: 1 after change:  1 完全没用~~~这是怎么回事? 我来说

  • nginx上传文件大小报错500的解决办法

    nginx上传文件大小报错500的解决办法 采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误.这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_buffer_size 配置请求体缓存区大小, 不配的话, client_body_temp_path 设置临时文件存放路径.只有当上传的请求体超出缓存区大小时,才会写到临时文件中 client_max_body_size 设置上传文件的最大值 所以查出来,问题出现的原

随机推荐