mybatis中加了if标签做判断,为什么报如下错误

<select id="selectcallHour" parameterType="java.lang.String" resultType="com.sunyard.monitor.domain.General" resultMap="callHour">

        select *
        from abc t1
                 left join def t2
                           on t1.object_id = t2.object_id
        where t2.object_name in
              <if test="opt!=null and '0'== opt">
                  ('GRQU_ALL')
              </if>
                <if test="opt!=null and '1' == opt">
                    ('ZH_MM','XYK_MM')
                </if>

          and substr(time_key, 1, 8) = to_char(trunc(sysdate), 'yyyymmdd')
        

    </select>
2021-08-11 17:39:19.169  INFO 72216 --- [           main] com.sunyard.monitor.runner.GenesysInit   : 项目启动完毕,初始化genesys完毕
2021-08-11 17:39:23.406  INFO 72216 --- [nio-8000-exec-2] o.a.c.c.C.[.[localhost].[/monitor]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-08-11 17:39:23.410  INFO 72216 --- [nio-8000-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-08-11 17:39:23.412  INFO 72216 --- [nio-8000-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'opt' in 'class java.lang.String'
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy59.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
    at com.sun.proxy.$Proxy60.selectcallHour(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
阅读 2.4k
3 个回答

首先mybatis查询入参一般使用@Param注解

List<Integer> selectCallHour(@Param("opt") String opt);

之后可以在sql中使用opt进行条件判断/#{opt}取到值

其次mybatis不支持IN (XXX,XXX)的直接写法,需要将IN的集合处理为入参查询;
多个list入参需要构造一个entity传参,下面我给你补充了

1. 多list入参查询entity

image.png

2.入参处理+mapper方法调用

image.png

3.mapper.java

image.png

4.mapper.xml

image.png

控制台sql+输出打印

1.不传opt(null)

image.png

2.opt=0

image.png

3.opt=1

image.png

<select id="selectcallHour" parameterType="java.lang.String" resultType="com.sunyard.monitor.domain.General" resultMap="callHour">
        select *
        from abc t1
                 left join def t2
                           on t1.object_id = t2.object_id
    <where> 
        t2.object_name in
        <if test="opt!=null and '0'== opt">
                  ('GRQU_ALL')
        </if>
        <if test="opt!=null and '1' == opt">
                    ('ZH_MM','XYK_MM')
        </if>
        and substr(time_key, 1, 8) = to_char(trunc(sysdate), 'yyyymmdd')
    </where>

</select>

你可以去掉parameterType="java.lang.String"
mapper
image.png
xml
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题