jeecgboot / JimuReport

「数据可视化:报表、仪表盘、大屏」积木报表是一款类Excel操作风格,在线拖拽设计的报表工具和和数据可视化产品。功能涵盖: 报表设计、打印设计、图形报表、仪表盘门户设计、大屏设计等,完全免费!秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开发周期、解决各类报表难题。
http://jimureport.com
GNU General Public License v3.0
6.52k stars 1.66k forks source link

1.6.4版本采用SQL占位符方式未将null值替换 #2075

Closed NapChen closed 1 year ago

NapChen commented 1 year ago
版本号:

1.6.4

问题描述:

在1.6.2以前采用拼接SQL字符串的形式时,当参数传递为null值时,拼接时会替换成空字符串,此时可以通过like实现动态传参,在1.6.2以后采用占位符的形式,如果参数传递null,并未进行转化,导致无法查询数据。

地址链接 http://localhost:8000/jmreport/getQueryInfo?reportId=872604082071498752&param={"token":"eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJlMzkwZmNjNWY1MTM0YTQ3OGE1YTJjYjg0ZGZmMTg1MiIsInVzZXIiOiJhZG1pbiIsInN1YiI6ImFkbWluIn0.UnVjDfTbAGLzW0T3uRVr88l65RRJwTXIxxjiq05gbiAc3SnZFQkwvqcnyDNr7g1B1eeATFOgGyykHSW0wIPTXw","reportType":"materialConsumptionClassReport","linename":"","startTime":"2023-10-01","endTime":"2023-10-17"}

其中的参数linename的值为空。

1.6.2 输出SQL,此时能够查询出数据

select t.*
from V_REP_MATERIAL_CONSUMP_CLASS t
where to_date(t.DATE_TIME, 'yyyy-mm-dd') >= to_date('2023-08-01', 'yyyy-mm-dd')
  and to_date(t.DATE_TIME, 'yyyy-mm-dd') <= to_date('2023-10-17', 'yyyy-mm-dd')
  and t.LINENAME like '%%'
order by to_date(t.DATE_TIME, 'yyyy-mm-dd') desc, LINENAME asc, DATA_SORT asc

1.6.4 输出SQL,此时不能查询出数据

select t.*
from V_REP_MATERIAL_CONSUMP_CLASS t
where to_date(t.DATE_TIME, 'yyyy-mm-dd') >= to_date(:sqlParamsMap.startTime, 'yyyy-mm-dd')
  and to_date(t.DATE_TIME, 'yyyy-mm-dd') <= to_date(:sqlParamsMap.endTime, 'yyyy-mm-dd')
  and t.LINENAME like '%:sqlParamsMap.linename%'
order by to_date(t.DATE_TIME, 'yyyy-mm-dd') desc, LINENAME asc, DATA_SORT asc

此时输出的参数日志 jc-2023-10-17 10:28:52 [http-nio-8000-exec-1] INFO o.j.m.jmreport.desreport.service.a.e - ------报表查询参数: {startTime=2023-08-01, linename=null, endTime=2023-10-17}

错误日志&截图:
image
重现步骤:

分别使用1.6.0和1.6.4在SQL中使用like语法,并传递一个空参数

zhangdaiscott commented 1 year ago

sql配置截图看下

NapChen commented 1 year ago

sql配置截图看下

spring:
  datasource:
    druid:
      db-type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: oracle.jdbc.OracleDriver
      url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
      username: ${DB_USER:***}
      password: ${DB_PWD:***}
      # 初始连接数
      initial-size: 5
      # 最小连接数
      min-idle: 15
      # 最大连接数
      max-active: 30
      # 获取连接超时时间
      max-wait: 5000
      # 连接有效性检测时间
      time-between-eviction-runs-millis: 60000
      # 连接在池中最小生存的时间
      min-evictable-idle-time-millis: 300000
      # 连接在池中最大生存的时间
      max-evictable-idle-time-millis: 900000
      # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
      test-while-idle: true
      # 指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个
      test-on-borrow: true
      # 是否在归还到池中前进行检验
      test-on-return: false
      # 检测连接是否有效
      validation-query: select 1 from dual
      # 配置监控统计
      webStatFilter:
        enabled: true
      stat-view-servlet:
        enabled: true
        # 控制台管理用户名和密码
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: 123456
      filter:
        stat:
          enabled: true
          # 记录慢SQL
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true

jeecg:
  # local|minio|alioss
  uploadType: local
  # local
  path:
    #文件路径
    upload: D:\zdl-web\file\report\
  jmreport:
    #多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)
    # saasMode: tenant
    # 平台上线安全配置(v1.6.2+ 新增)
    firewall:
      # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并不允许查询数据库)
      dataSourceSafe: false
      # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可放开限制)
      lowCodeMode: dev
zhangdaiscott commented 1 year ago

你的报表的数据集的sql

NapChen commented 1 year ago

你的报表的数据集的sql

select t.*
from V_REP_MATERIAL_CONSUMP_CLASS t
where to_date(t.DATE_TIME, 'yyyy-mm-dd') >= to_date('${startTime}', 'yyyy-mm-dd')
  and to_date(t.DATE_TIME, 'yyyy-mm-dd') <= to_date('${endTime}', 'yyyy-mm-dd')
  and t.LINENAME like '%${linename}%'
order by to_date(t.DATE_TIME, 'yyyy-mm-dd') desc, LINENAME asc, DATA_SORT asc
1298191366 commented 1 year ago

1.6.2 版本后 like语句需要使用sql自带函数concat拼接一下,如CONCAT(CONCAT('%','${参数}'),'%')) 参考文档:https://help.jeecg.com/jimureport/query/function.html#4-like%E6%9F%A5%E8%AF%A2